可能有更好的方法可以做到这一点,但我正在尝试在rails中根据当前操作在控制器中创建一个if语句(这将在视图中使用)。
例如,如果是编辑页面或节目页面等,我想要一种不同的风格 - 是否有可以指定的if语句?
(我需要一个if语句,因为它在多个页面上用于部分语句。)
谢谢!
埃利奥特
答案 0 :(得分:49)
控制器中可用的params
哈希包含:controller
和:action
个键,用于指定请求的控制器和操作名称。
因此你可以说
if params[:action] == "foo"
# Show stuff for action 'foo'
elsif params[:action] == "bar"
# Show stuff for action 'bar'
elsif ...
# etc.
end
答案 1 :(得分:23)
IMO让部分人询问当前的控制器和动作名称是不好的做法。想想“告诉,不要问”(http://www.pragprog.com/articles/tell-dont-ask)。也就是说,不是让部分询问它的调用者的状态,而是告诉部分你想要它做什么。
执行此操作的一种方法是通过locals
选项将变量传递给partial:
<%= render :partial => "/common/toolbar", :locals => {:edit => true} %>
然后在部分:
<% if defined?(edit) && edit %>
... stuff appropriate to edit mode
<% end %>
答案 2 :(得分:3)
你可以这样做:
class ApplicationController < ActionController::Base
layout :set_layout
def set_layout
case params[:action]
when "foo"
"foo_layout"
when "bar"
"bar_layout"
...
else
"default_layout"
end
end
...
end
希望它有帮助=)
答案 3 :(得分:1)
您也可以使用部分布局:
<%= render :partial => 'some_partial', :layout => 'wrap_with_stuff' %>
如果你想弄清楚动态使用什么布局,我会把它放在帮手中。所以你最终得到了
# In your view
<%= render :partial => 'some_partial', :layout => layout_for_my_partial %>
# In your helper
def layout_for_my_partial
params[:action] == 'show' ? 'show_wrapper' : 'everything_else_wrapper'
end
这只会在某些情况下起作用,但可能就是你要做的事情。
在此处查看更多信息。
http://ryandaigle.com/articles/2007/8/3/what-s-new-in-edge-rails-partials-get-layouts