我接受用户的输入
在我的索引操作中,我有:
@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是两种不同的模型
答案 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" %>