私はちょうどレールに入り、ゆっくりとそれを理解し始めています。誰かがapplication_controller内でコーディングする利点や、いつ、なぜかについて説明したり、アイデアを教えてもらえますか?いくつかのユースケースは何ですか。Railsアプリのアプリケーションコントローラーをどのように使用していますか?私が理解していることから、このコントローラーはすべての要求に対して呼び出されるため、あまり多くのコードをそこに入れたくありません。これは本当ですか?
2 に答える
ApplicationControllerは、実際には、アプリケーション内の他のすべてのコントローラーが継承するクラスです(ただし、これは必須ではありません)。
ApplicationControllerがコードを配置するのに適した場所である場合もありますが、あまり多くのコードを乱さず、クリーンで整頓された状態に保つという態度に同意します。例:複数のロケールファイルを使用していて、要求されたURLに基づいてロケールを設定する場合は、ApplicationControllerでこれを行います。
before_filter :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
これにより、各コントローラーでロケールを個別に設定するという頭痛の種を回避できます。これを1回実行すると、システム全体にロケールが設定されます。
protect_from_forgery
同じことが、新しいRailsアプリのデフォルトのApplicationControllerにある有名なものにも当てはまります。
別のユースケースは、アプリケーション内の特定のタイプのすべての例外を救済することです。
rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found
private
def record_not_found
render :text => "404 Not Found", :status => 404
end
一般に、他のすべてのコントローラーが確実に使用する機能がある場合は、ApplicationControllerが適している可能性があります。
複数のコントローラーで使用する必要のあるヘルパーやメソッドに使用します。良い例は、ライアン・ベイツの「ゼロからの超シンプルな認証」です。
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :admin?
protected
def authorize
unless admin?
flash[:error] = 'Sorry, that page is only for admins'
redirect_to :root
false
end
end
def admin?
session[:password] == "password"
end
end
次に、アプリ内のどこからでも、before_filter :authorize
またはif admin?
どこからでも実行できます。