Rails中如何给action设置特定的layout?

render action with custom layout page.

问题描述

默认情况下,controller 中action的layout都是application.html.erb,也可以统一更换,在controller中,添加:

layout 'my_layout'

现在假定,针对action new,需要使用layout:my_layout, 其他的actions都采用application, 如何实现?

解决方法

我曾一厢情愿地以为应该可以这样, 在controller中添加如下语句👇:

layout 'my_layout', :only => :new

显然,一厢情愿的结果常常都面临着悲剧。

正确的脱坑方式是这样的👇:

在controller中定义一个private method, 然后在该method中进行设置:

layout :my_layout
.....

 private

def my_layout
    params[:action] == 'new' ? 'my_layout' : 'application'
end

如果是指定的多个action都是my_layout呢?

这么设置:

layout :my_layout
.....

 private

def my_layout
    %w[action1 action2 action3……].include?params[:action] ? 'my_layout' : 'application'
end

Ok。

参考

Rendering Layout for specific actions