【问题标题】:Rails 3: ensure calling controller method from viewRails 3:确保从视图中调用控制器方法
【发布时间】:2012-06-20 10:57:11
【问题描述】:

导轨 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:有问题的局部视图与控制器及其操作没有直接关系。这在逻辑上是布局的一部分(仪表板显示可能需要注意的任务组的链接)。因此,在大约一半的控制器操作中,忘记在几个if 分支中调用set_menu_vars 是很自然的。另一方面,set_menu_vars 对数据库进行了一些不那么短的查询,所以我希望当且仅在需要时调用它(也就是说,如果真正呈现了相关视图)。

【问题讨论】:

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


    【解决方案1】:

    这不是“Rails 方式”。

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

    模型(article.rb):

    def do_something
     code
    end
    

    控制器(articles_controller.rb):

    def index
     @article = Article.do_something
    end
    

    查看(文章/index.html.erb)

    <%= @article %>
    

    对不起,如果我误解了你的问题。

    【讨论】:

    • 是的,你误解了我的问题,可能是因为我问的不够清楚。请参阅 UPD。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多