我接受用户的输入
在我的索引操作我有:
@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" %>