0

application_controller.rbには、次のものがあります。

before_filter :get_events
before_filter :get_sitemap
def login_required
    return true if session[:user]
    # If we get to this point, I want to avoid running get_events and get_sitemap
    flash[:warning] = 'Please login to continue'
    redirect_to login_users_url
    return false 
end

そして、他のコントローラーでは、例えば:

before_filter :login_required, :except => [:show]

したがって、基本的に、ユーザーがログインする必要がある場合(つまり、通常get_eventsとget_sitemapが必要なページからリダイレクトされる場合)にデータベースにアクセスしたくない場合を除いて、すべてのページのデータベースにアクセスするメソッドを実行しています。

これを行う1つの方法は、他のbefore_filtersが設定される前に、すべてのコントローラーでbefore_filterとしてlogin_requiredを実行し、特定のコントローラーモデルを除外することですが、すべてのコントローラーを変更せずに実行する方法があるかどうかを知りたいです。 。

4

2 に答える 2

4

このようなもののために、私は通常AuthenticatedController(app / controllers / authenticated_controller.rbに)を作成します:

class AuthenticatedController < ApplicationController

  before_filter :require_login

end

次に、認証が必要なすべてのコントローラーをそこから導き出し、skip_before_filter :require_loginコントローラーごとに除外するアクションを指定します。例えば:

class PlanetsController < AuthenticatedController

  skip_before_filter :require_login, only: [:index]

end

これには、すべてのコントローラーを変更する必要がありますが、から派生する目的でのみですAuthenticatedController。私の知る限り、これは完全に受け入れられる処理方法であり、モンキーパッチを適用するActionController :: Base以外に、これをすべてのコントローラーに適用する方法はないと思います。これは、さまざまなコントローラーにとってかなり悪い考えです。理由。

于 2013-01-15T02:35:30.257 に答える
0

ジョシュアの答えを検討した後でも、私は自分がやりたいことを得ることができませんでした...それで私がしたことは少しハイブリッドな解決策をすることでした。すべてのコントローラーは引き続きApplicationControllerを参照しますが、ApplicationController内では、常にbefore_filter :login_requiredFIRSTを他のbefore_filtersの前に実行します。レール内のリダイレクトは、他のbefore_filtersの実行を停止しているようです。これは、私が望んでいたことです。他のコントローラーでは、skip_before_filter :login_required, :only => [:this_time]必要に応じて使用します。

于 2013-01-15T03:38:52.923 に答える