12

同一のbefore_filterを使用する複数のコントローラーがあります。物事を乾いた状態に保つために、すべてのコントローラーが使用できるように、このメソッドはどこに配置する必要がありますか?理由はわかりませんが、モジュールは適切な場所ではないようです。コントローラーにはすでに異なるスーパークラスがあるため、基本クラスに入れることはできません。

4

4 に答える 4

30

before_filterとメソッドをモジュールに入れて、各コントローラーに含めるのはどうですか。このファイルをlibフォルダーに置きます。

module MyFunctions

  def self.included(base)
    base.before_filter :my_before_filter
  end

  def my_before_filter
    Rails.logger.info "********** YEA I WAS CALLED ***************"
  end
end

次に、コントローラーで、あなたがしなければならないのは

class MyController < ActionController::Base
  include MyFunctions
end

最後に、libが自動ロードされるようにします。config / application.rbを開き、アプリケーションのクラスに以下を追加します。

config.autoload_paths += %W(#{config.root}/lib)
于 2012-08-14T13:47:25.043 に答える
4

このようなことができます。

Class CommonController < ApplicationController
  # before_filter goes here
end

Class MyController < CommonController
end

class MyOtherController < CommonController
end
于 2012-08-13T18:39:56.853 に答える
3

before_filterコントローラの共有スーパークラスにを配置します。継承チェーンをはるかに上って、これが最終ApplicationController的にbefore_filterなる必要があり、適用すべきではない一部のコントローラーにを適用する必要がある場合はskip_before_filter、それらの特定のコントローラーで使用する必要があります。

class ApplicationController < ActionController::Base
  before_filter :require_user
end

# Login controller shouldn't require a user
class LoginController < ApplicationController
  skip_before_filter :require_user
end

# Posts requires a user
class PostsController < ApplicationController

end

# Comments requires a user
class CommentsController < ApplicationController

end
于 2012-08-13T18:42:32.567 に答える
1

すべてのコントローラーに共通の場合は、アプリケーションコントローラーに配置できます。そうでない場合は、新しいコントローラーを作成し、それをすべてのスーパークラスにして、コードをその中に入れることができます。

于 2012-08-13T18:38:06.873 に答える