如何为Rails视图指定特定布局?devise_invitable控制器布局覆盖问题
Devise Invitations控制器布局覆盖问题
问题描述
使用devise_invitable实现邀请控制器时,期望new动作使用admin布局,edit动作使用devise默认布局,但编写的代码中多次调用layout方法会互相覆盖,调换顺序也无法解决问题。
控制器代码如下:
class InvitationsController < Devise::InvitationsController layout 'devise', only: [:edit] layout "admin", only: [:new] # 其他代码... end
问题原因
Rails中,控制器内多次调用layout方法时,后续的调用会覆盖之前的布局配置——哪怕你指定了only选项。这是因为每次调用layout都是在更新控制器的默认布局规则,而非追加规则。所以最后一次layout调用会成为控制器的默认布局设置,之前的规则会被忽略。
解决方法
可以通过传递一个lambda(匿名函数)给layout方法,根据当前动作动态返回对应的布局名称,这样就能为不同动作指定不同布局:
class InvitationsController < Devise::InvitationsController # 根据当前动作动态选择布局 layout -> { action_name == 'new' ? 'admin' : 'devise' } # 其他代码... end
也可以通过before_action来动态设置布局,适合更复杂的判断场景:
class InvitationsController < Devise::InvitationsController before_action :set_controller_layout # 其他代码... private def set_controller_layout self.class.layout(action_name == 'new' ? 'admin' : 'devise') end end
内容的提问来源于stack exchange,提问作者Dan Rubio
相关产品推荐
相关产品推荐

