Rails 3:确保从视图中调用控制器方法

时间:2012-06-20 10:57:12

标签: ruby-on-rails-3 model-view-controller

Rails 3.2.6。我有一个跟随控制器 - 视图组合(简化,实际上分配是一些模型调用的结果):

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

到目前为止一直很好,直到我忘记了某个动作来调用set_menu_vars - 现在我得到一个异常undefined method '>' for nil:NilClass。这是可以理解的,我想确保如果使用该部分视图,则会自动调用set_menu_vars

所以我尝试将视图修改为

- @controller.set_menu_vars
...

(谷歌搜索),但得到类似的例外,说@controllernil。好吧,这些答案似乎适用于Rails 2,看到了。我试图改为

- controller.set_menu_vars
...

现在成功调用set_menu_vars,但视图中的@var1仍为nil

所以问题是:完成任务的正确方法是什么?在控制器中为每个变量设置一个方法(查找实例变量以最多调用一次模型)?或者其他一些方式?

UPD :有问题的局部视图与控制器及其动作没有直接关系。这在逻辑上是布局的一部分(仪表板显示可能需要注意的任务组的链接)。因此,忘记在大约一半控制器操作中的几个set_menu_vars分支中调用if是很自然的。另一方面,set_menu_vars对数据库执行一些不那么简短的查询,因此我希望当且仅当需要它时才调用它(即,如果有问题的视图真的被渲染)。

1 个答案:

答案 0 :(得分:0)

它不是'Rails Way'。

控制器从模型中调用方法。

模型(article.rb):

def do_something
 code
end

控制器(articles_controller.rb):

def index
 @article = Article.do_something
end

视图(物品/ index.html.erb)

<%= @article %>

很抱歉,如果我误解了你的问题。