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



我接受用户的输入

在我的索引操作我有:

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

我想在show操作和index操作中使用存储在@b中的值。

在我的show动作中,我想这样做:

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

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

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

我只是想用一种方法来声明@b是全局的

和使用$b而不是@b来达到目的

您可以像这样将它包含在before过滤器中:

before_filter :find_b, :only => [:index, :show]
# Standard controller actions here.
private
def find_b
  @b = Ece.find_by_code("#{params[:course]}")
end

控制器过滤器是ActionController的一部分,你可以在这里找到有关它们的文档。除了在操作之前运行的before过滤器之外,还有after过滤器和around过滤器,它们分别在操作前后运行。

在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 -保持视图整洁-并将其移动到位控制器中。那么现在控制器中的show动作就会有这样一行

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

,你可以把你的视图链接写得更干净,写成

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

最新更新