0

私は宝石を使用していdeviseます。Deviseはアプリケーションコントローラーを拡張し、Railsアプリケーションにユーザー管理を追加します。

宝石の中を見ると、次の行が見えます

class Devise::SessionsController < ApplicationController

Deviseコントローラーに。という名前のカスタムコントローラーを継承させたいので、これを変更しようとしています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

DeviseはRailsエンジンです。あなたのサイトの管理セクションを作成する最良の方法は、レールエンジンを作成することだと思います。または、 rails_adminまたはactiveadminを使用することをお勧めします。どちらも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 に答える