7

例如,我使用 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

4 回答 4

12

尝试:

if action_name == "new" or action_name == "edit"

或者:

if ["new", "edit"].include? action_name
于 2013-04-05T19:09:03.590 回答
3

你可能想要这个:

if action_name == 'new' || action_name == 'edit'
于 2013-04-05T19:11:30.220 回答
1

所以我尝试了 MrDanA 的答案,但它需要括号才能工作,如下所示:

if ["new", "edit"].include?(action_name)
于 2017-11-23T11:30:59.397 回答
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

如果您只是覆盖少量操作的布局,最后一个甚至可能是最佳选择,因为它非常清晰。

于 2019-08-22T15:48:49.443 回答