Rhodes Rhomobile - переопределить поведение макета для определенного вида - PullRequest
0 голосов
/ 17 декабря 2011

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

Я бы хотел переопределить поведение макета для определенного вида.Я нашел документацию Родоса, описывающую, что делать.(копия документации 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», но если перейти к представлению «About» и вернуться к представлению «Calculator», рендеринг калькулятора выполняется с использованием стандартной компоновки.

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

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

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

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

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

layout: mycustomlayout

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


Ответы [ 2 ]

0 голосов
/ 03 сентября 2013

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

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

На самом деле, вы можете просто назначить макет для контроллера. Существует множество способов, но, в частности, вы можете делать то, что якобы упоминают в документах, но не так, как пытались «идешены». Если вы проверите исходный код в 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
0 голосов
/ 21 декабря 2011

В контроллере необходимо указать метод действия. Метод действия 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
...