如何在控制器中设置全局变量

时间:2011-08-21 05:47:47

标签: ruby-on-rails ruby-on-rails-3

我接受用户的输入

在我的索引操作中,我有:

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

我想在我的show动作和索引动作中使用@b中存储的值。

在我的节目动作中,我想做这样的事情:

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

如何将@b设置为全局,以便这两个操作都可以使用它

注意:Ece和Course是两种不同的模型

3 个答案:

答案 0 :(得分:14)

我只想用一种方法将@b声明为全局。

使用$ b代替@b可以解决问题

答案 1 :(得分: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。除了在操作之前运行的过滤器之外,还有过滤器之后以及分别在操作之前和之后运行的过滤器之后。

答案 2 :(得分:0)

在Rails中,将@b定义为您无法定义的地方并不是一个好习惯,因为您可能会发现在稍后回顾它时很难确定控制器中发生了什么。< / p>

我建议你在show和index动作的开头明确设置@b:换句话说,重复你的

@b = Ece.find...

在每个show和index动作中 - 我相信你正在做的事情。

如果您想稍微清理一下控制器代码,那么请定义一个私有函数

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 - 保持视图更清晰 - 并将其移至位控制器。所以现在你在控制器中的show动作将有一个像这样的行

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

您可以更清晰地编写视图链接

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