Rhodes Rhomobile — переопределить поведение макета для определенного вида

Мне нужна помощь в очень конкретном случае.

Я хотел бы переопределить поведение макета для определенного представления. Я нашел документацию Rhodes, описывающую, что делать. (копия документации Rhodes вставлена ​​внизу этого текста)

Я попытался использовать второй вариант («вызов метода макета на контроллере, чтобы перезаписать имя макета по умолчанию»), но это не сработало. Я предполагаю, что, возможно, неправильно понял, как кодировать контроллер, или, надеюсь, у меня только синтаксическая ошибка... См. дополнительную информацию о приложении ниже.

Может ли кто-нибудь сказать мне, как мне это сделать? Каким будет правильный синтаксис? Или я должен использовать другой метод?

Заранее спасибо.

Луи Дешен

Вот некоторая информация о приложении и о том, что я сделал:

  • Простое приложение
  • Сборка для iPhone
  • Запуск приложения в режиме "Калькулятор"
  • Представление «Калькулятор» вызывает представление «Управление», вызывающее представление «Справка»
  • Структура приложения:

    app/
    ->  index.erb                        (Control view)  
    ->  layout.erb                       (Standard layout)  
    ->  calculatorlayout.erb             (Customize layout for Calculator view)  
    ->  calculator/  
    ----->    index.erb                  (Calculator view)  
    ----->    calculator_controller.erb  (Controller to be able to override layout)  
    ->  help/  
    ----->    index.erb                  (Help view)
    
  • Я создал Calculator_controller.erb, содержащий

    require 'rho/rhocontroller'
    
    require 'helpers/browser_helper'
    
    class CalculatorController < Rho::RhoController
    
    include BrowserHelper
    
    layout :calculatorlayout (Thats what  Rhodes doc mentionned to do)
    
  • Как я уже сказал, это не работает. Пожалуйста, скажите мне, как правильно это сделать.

  • Примечание. В качестве временной меры я сделал копию app/calculatorlayout.erb в app/calculator/layout.erb. Это делает рендеринг правильно, когда приложение запускается в представлении «Caculator», но если я перехожу к представлению «О программе» и обратно для просмотра «Калькулятор» рендеринг калькулятора выполняется со стандартным макетом.

--------Документация по Родосу------------------------------------------------------- ----

Если вы хотите переопределить или настроить поведение макета, вы можете вызвать функцию рендеринга со следующими параметрами:

render :action => 'index', :layout => 'mycustomlayout', :use_layout_on_ajax => false

Первый аргумент — это действие, которое вы хотите выполнить. Далее идет (необязательное) имя макета, которое предполагает, что корень приложения является базовым каталогом. В приведенном выше примере Роудс будет искать файл с именем «mycustomlayout.erb» в корневом каталоге приложения (вы также можете использовать :layout => false, чтобы отключить использование шаблона макета). Аргумент use_layout_on_ajax сообщает Rhodes, следует ли использовать макет для вызовов Ajax (по умолчанию — false).

Вы можете вызвать метод макета на контроллере, чтобы перезаписать имя макета по умолчанию:

макет: мой пользовательский макет

Это заставит вызов рендеринга использовать mycustomlayout.erb вместо файла макета по умолчанию для всех действий этого контроллера.



person ldeschenes    schedule 17.12.2011    source источник


Ответы (2)


В контроллере нужно указать метод действия. Метод render действия обрабатывает свойство layout. Вы не можете просто назначить раскладку для всего контроллера. Ниже приведен пример файла контроллера. Затем вам понадобится файл представления index.erb, соответствующий методу действия index.

CalculatorController.rb

require 'rho/rhocontroller'
require 'helpers/browser_helper'

class CalculatorController < Rho::RhoController
    include BrowserHelper

    def index
        # perform any logic or fetch objects for the index.erb view

        render :action => :index, :layout => 'calculatorLayout'
    end

end
person Geoffrey    schedule 21.12.2011

К сожалению, Rhodes имеет ужасную документацию, поэтому его механику может быть трудно расшифровать. Но я должен отметить, что, к сожалению, Джеффри совершенно не прав в этом вопросе:

Вы не можете просто назначить макет для всего контроллера

На самом деле вы можете просто назначить макет для контроллера. Существует множество способов, но в частности вы можете сделать так, как предположительно упоминается в документах, но не так, как пытался ideschenes. Если вы просмотрите исходный код в render.rb, вы заметите, что RhoController определяет метод установки именно для этой цели, что является базовой механикой Ruby.

def self.layout(name)
  @layout = name
end

Поэтому вы можете использовать self.layout = :layout_name или @layout = :layout_name внутри контроллера, чтобы определить макет по умолчанию. Я не знаю сложности того, как это можно переопределить, но этот метод позволит вам установить макет по умолчанию для любого контроллера. Я проверил это на себе.

В RhoController также есть метод, который извлекает имя макета, и вы, конечно, можете переопределить его в своем собственном контроллере, если хотите настроить поведение при выборе макета.

def self.get_layout_name
  @layout.nil? ? 'layout' : @layout
end
person Steve Benner    schedule 03.09.2013