更改Devise控制器的布局

时间:2012-12-21 21:42:35

标签: ruby-on-rails

我正在使用gem devise。 Devise扩展了应用程序控制器并将用户管理添加到rails应用程序。

当我看到宝石内部时,我可以看到以下行

class Devise::SessionsController < ApplicationController

我正在尝试更改此项,因为我希望Devise控制器继承自名为AdminController的自定义控制器。原因是我完成了整个Web应用程序,我不希望页面的管理部分使用我的应用程序布局,css,js ......

如何动态更改控制器的基类?或动态告诉控制器使用admin.html.erb布局而不是application.html.erb布局。

当我说“动态”时,我的意思是猴子补丁,谢谢。

3 个答案:

答案 0 :(得分:2)

设计是rails engine。我认为制作网站管理部分的最佳方法是制作一个rails引擎。或者更好的是使用rails_adminactiveadmin。它们都是rails引擎有一个关于rails engines

的railscast

我不知道你app的内部作品,但如果你添加

layout "admin"

到您的AdminController并使用

将自定义管理布局添加到view / layouts文件夹
 <%= stylesheet_link_tag 'admin' %>
 <%= javascript_include_tag "admin"%>

AdminController视图将使用管理样式表和javascript

答案 1 :(得分:2)

这解决了我的问题,如果控制器的命名空间是Devise使用管理员布局。

class ApplicationController < ActionController::Base
  protect_from_forgery

  layout :determine_layout

  def determine_layout
    module_name = self.class.to_s.split("::").first
    return (module_name.eql?("Devise") ? "admin" : "application")
  end
end

答案 2 :(得分:2)

如果您只需要更改布局,我认为您应该可以通过重新打开控制器类来实现。在initializers/devise.rb的底部(在顶层的配置部分下方,您可以写:

Devise::SessionsController.layout :admin

我没试过这个,但理论上它应该可以工作,因为layout只是ActionController.base上的一个类方法。