2011-08-21 51 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" %>