如果action_name Rails

时间:2013-04-05 19:07:32

标签: ruby-on-rails ruby

我正在使用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

但它不起作用。有什么想法吗?

4 个答案:

答案 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

如果您只是为少量操作覆盖布局,那么最后一个甚至可能是最好的选择,因为它很清楚。