我正在使用if action_name来定义布局,例如
layout :layout_by_action_name
def layout_by_action_name
if action_name == 'new'
"layout_file"
else
"application"
end
end
如何使用new
添加其他操作名称,例如edit
。我试过了:
layout :layout_by_action_name
def layout_by_action_name
if action_name == 'new' && 'edit'
"layout_file"
else
"application"
end
end
但它不起作用。有什么想法吗?
答案 0 :(得分:12)
尝试:
if action_name == "new" or action_name == "edit"
或者:
if ["new", "edit"].include? action_name
答案 1 :(得分:3)
你可能想要这个:
if action_name == 'new' || action_name == 'edit'
答案 2 :(得分:0)
所以我尝试了MrDanA的答案,但它需要括号才能工作,如下:
if ["new", "edit"].include?(action_name)
答案 3 :(得分:0)
Rails 3.1+提供了in?
方法,因此您现在可以编写此代码:
layout :layout_by_action_name
def layout_by_action_name
if action_name.in?('new','edit')
'layout_file'
else
'application'
end
end
在Rails 4+中,您可以更加简洁地完成此操作,因为layout需要proc:
layout ->{ action_name.in?('new','edit') ? 'layout_file' : 'application' }
另一方面,如果您有一组特别复杂的要求,那么案例说明可能更有意义:
def layout_by_action_name
case action_name
when 'new','edit'
'layout_file'
when 'delete'
'other_file'
else
'application'
end
end
最后,您可以通过在render
调用中指定布局来以老式的方式进行操作:
def new
...
render layout: 'layout_file'
end
def edit
...
render layout: 'layout_file'
end
如果您只是为少量操作覆盖布局,那么最后一个甚至可能是最好的选择,因为它很清楚。