2012-06-20 104 views
0

Rails 3.2.6。我有一個跟隨控制器視圖組合(簡化的,在現實中分配是到的一些模型調用的結果):Rails 3:確保從視圖中調用控制器方法

ApplicationController

def set_menu_vars 
    @var1 = 1 
    @var2 = 2 
end 

SomeController < ApplicationController

def some_action 
    set_menu_vars 
end 

相應的(局部,共享)view(haml):

- if @var1 > 0 
    %p= @var1 

因此fa如此好,直到我忘記了在某個行動中致電set_menu_vars - 現在我得到一個例外undefined method '>' for nil:NilClass。這是很容易理解的,我想確保如果使用該部分視圖,set_menu_vars被自動調用。

所以我嘗試修改視圖

- @controller.set_menu_vars 
... 

(Google搜索),但得到類似的異常說@controllernil。那麼,這些答案似乎是針對Rails 2的。我試圖改變

- controller.set_menu_vars 
... 

現在set_menu_vars調用成功,但@var1仍然在視圖nil

所以問題是:什麼是正確的方式來完成任務?在控制器中爲每個變量設置一個方法(查找實例變量以最多一次對模型進行調用)?或者以其他方式?

UPD:所討論的局部視圖與控制器及其操作無直接關係。這在邏輯上是佈局的一部分(儀表板顯示可能需要注意的任務組的鏈接)。所以這是非常自然的,因爲忘記在約一半的控制器動作中的幾個if分支中調用set_menu_vars。另一方面,set_menu_vars對數據庫做了一些不那麼簡短的查詢,所以我希望在需要時調用它(當然,如果視圖是真正呈現的話)。

回答

0

它不是'Rails方式'。

控制器從模型調用該方法。

模型(article.rb):

def do_something 
code 
end 

控制器(articles_controller.rb):

def index 
@article = Article.do_something 
end 

視圖(物品/ index.html.erb)

<%= @article %> 

對不起如果我誤解了你的問題。

+0

是的,你誤解了我的問題,可能是因爲我沒有足夠清楚地詢問它。請參見UPD。 –

相關問題