2012-06-20 3 views
0

Рельсы 3.2.6. У меня следующая комбинация контроллера вида (упрощенный, в действительности присвоение результатов некоторых модельных вызовов):Рельсы 3: обеспечить вызов метода контроллера из вида

ApplicationController:

def set_menu_vars 
    @var1 = 1 
    @var2 = 2 
end 

SomeController < ApplicationController:

def some_action 
    set_menu_vars 
end 

соответствующих (частичные, общих) вид (haml):

- if @var1 > 0 
    %p= @var1 

Таким образом, fa r так хорошо, пока я не забуду в каком-то действии, чтобы позвонить set_menu_vars - теперь я получаю исключение undefined method '>' for nil:NilClass. Это вполне понятно, и я хочу убедиться, что если это частичное представление используется, set_menu_vars называется автоматически.

Поэтому я стараюсь изменить вид, как

- @controller.set_menu_vars 
... 

(Гугл), но получить аналогичное исключение, говоря, что @controller является nil. Ну, эти ответы, похоже, для Rails 2, видя. Я пытался изменить к

- controller.set_menu_vars 
... 

Теперь set_menu_vars называется успешно, но @var1 еще в представлении nil.

Итак, вопрос в том, каков правильный способ выполнить задачу? Имейте метод в контроллере для каждой из этих переменных (ищите переменную экземпляра, чтобы заставить вызов моделировать не более одного раза)? Или каким-то другим способом?

UPD: рассматриваемый частичный вид не имеет прямого отношения к контроллеру и его действию. Это логически является частью макета (панель мониторинга показывает ссылки на группы задач, которые могут потребовать внимания). Поэтому очень естественно забыть позвонить set_menu_vars в несколько if ветвей среди примерно половины действий контроллера. С другой стороны, set_menu_vars выполняет несколько не столь коротких запросов к базе данных, поэтому я хочу, чтобы он вызывался тогда и только тогда, когда это необходимо (то есть, если рассматриваемое представление действительно отображается).

ответ

0

Его не «путь рельсов».

Контроллер вызывает метод из модели.

модель (article.rb):

def do_something 
code 
end 

контроллер (articles_controller.rb):

def index 
@article = Article.do_something 
end 

вид (статьи/index.html.erb)

<%= @article %> 

К сожалению если я неправильно понял ваш вопрос.

+0

Да, вы неправильно поняли мой вопрос, возможно, потому, что я недостаточно ясно спрашиваю его. См. UPD, пожалуйста. –