2

したがって、3種類のユーザーがいます。

admin
moderator
regular user

次のようなコントローラー全体のシステムでモデレーターと管理者のページをロックしています。

def authorize
  unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).moderator == true
    redirect_to login_url, :notice => "Please log in with a moderator account"
  end
end

def authorize_admin
  unless User.find_by_id(session[:user_id]) and User.find_by_id(session[:user_id]).admin == 1
    redirect_to login_url, :notice => "Only admins can access the page you tried to access"
  end
end

しかし、通常のユーザーに、複数のコントローラーの編集ページ (そしてもちろん更新アクション) へのアクセスを許可する必要があります。ただし、編集して更新するだけです。

私が行った場合:

before_filter :authorize, :except => :edit

その後、誰でも (ログインしていなくても) それらのページにアクセスできます。

どうすればそのようなことをすることができますか?

編集

Thilo の提案に従って、application_controller.erb ファイルに以下を追加しました。

  def update_successful
    skip_before_filter :authorize
  end

通常のユーザーがエントリを編集した後に update_successful ページを提供できるようにするため。ただし、次のエラーが表示されます。

undefined method `skip_before_filter' for #<HomeController:0x007ff782aeb6f0>
4

1 に答える 1

2

グローバルに適用されるフィルターを明示的にスキップできます。

skip_before_filter :authorize, :only => [:edit, :update]

または、最初から関連するアクションに適用しないでください。

before_filter :authorize, :except => [:edit, :update]

編集

さらなる質問に答えるには: これをアプリケーション コントローラーに追加します。

def upload_successful
end

home/upload_successful.html.hamlこれは、テンプレートをレンダリングするときに Rails によって暗黙的に使用されていたアクションを明示的に定義する空のメソッドです。次に、フィルターを変更して、そのメソッドから認証を削除します。

before_filter :authorize, :except => [:upload_successful]

これは、Rails でのレンダリングの優れた紹介です。これは、デフォルトでのレンダリングを理解するのに役立ちます。これはupload_successful、一致するコントローラーまたはアクションが定義されていない状態でテンプレートが表示されているものです。

于 2012-04-19T15:25:41.710 に答える