0

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

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

class Devise::SessionsController < ApplicationController

我正在尝试更改此设置,因为我希望设计控制器从名为AdminController. 原因是我已经完成了整个 Web 应用程序,我不希望页面的管理部分使用我的应用程序布局、css、js ...

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

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

4

3 回答 3

4

这解决了我的问题,如果控制器的命名空间是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
于 2012-12-21T22:31:58.720 回答
2

设计是一个轨道引擎。我认为制作站点管理部分的最佳方法是制作 Rails 引擎。或者最好还是使用rails_adminactiveadmin。它们都是 Rails 引擎有一个关于Rails 引擎的 railscast

我不知道你的应用程序的内部工作,但如果你添加

layout "admin"

到您的 AdminController 并将自定义管理布局添加到 view/layouts 文件夹

 <%= stylesheet_link_tag 'admin' %>
 <%= javascript_include_tag "admin"%>

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

于 2012-12-21T21:50:52.540 回答
2

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

Devise::SessionsController.layout :admin

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

于 2012-12-21T23:08:23.633 回答