2011-08-21 55 views
3

我從用戶如何設置在控制器中的全局變量

投入在我的索引行動,我有:

@b = Ece.find_by_code("#{params[:course]}") 

我想使用存儲在@b值在我的節目行動以及在指數行動。

在我的表演動作我想要做這樣的事情:

<p><%= link_to "Forum", href="/courses/#{Course.find_by_courseCode(<%= @b %>).id}", :class=>"question_button round" %> 

我怎麼能設置@b是全球性的,使這兩個動作可以用它

注:歐洲經濟委員會和課程都兩種不同型號

回答

14

我只是想用一種方式來聲明@b到是全球性的。

,並使用$ B代替@b的伎倆

+1

我在哪裏需要聲明它呢?在該類的開始處或在特定方法['update','edit',...]內? –

7

你可以將它包括一個像這樣的過濾器之前:

before_filter :find_b, :only => [:index, :show] 

# Standard controller actions here. 

private 
def find_b 
    @b = Ece.find_by_code("#{params[:course]}") 
end 

控制器過濾器是ActionController的一部分,您可以在其中找到有關它們的文檔here。除了在動作之前運行的過濾器之前,還有在過濾器之後以及在動作周圍和之後運行的過濾器。

0

在Rails中,定義@b的地方並不是很好的做法,因爲您可能會發現很難在稍後回顧它時發現控制器中正在發生的事情。

我建議你在演出和索引動作都開始設置@b明確:換句話說,不要重複你

@b = Ece.find... 
在每個節目和索引操作

- 這就是你我相信已經在做。

如果你想清理控制器代碼一點,那麼就定義一個私有函數

private 
def find_b(my_params) 
    @b = Ece.find_by_code(my_params) 
end 

,因此現在設定@b這樣

@b = find_b("#{params[:course]}") 
控制器節目和索引操作

現在你有了更清晰的代碼,但同時你通過查看你正在設置的控制器@b並且你正在使用params來這樣做而立即知道。

至於你想要添加在你的show動作中的鏈接,在視圖中找不到路徑Course.find_by_courseCode - 保持視圖更清晰 - 並將其移動到位控制器。所以,現在你的節目在控制器動作都會有這樣的

@course = Course.find_by_id(@b.id) 

一條線,你可以更乾淨寫您的視圖鏈接爲

<%= link_to 'Forum', @course, :class=>"question_button round" %>