管理者だけが閲覧できる管理者ビューがあります。私は専門家を使ってアプリケーションを認可しています。私は、各管理コントローラのポリシーを作成することなく、管理者ビューにすべてのユーザーが、管理者を拒否(およびAUTHORIZEと各コントローラを飾る)どうやっpunditを使用して管理者ビューからユーザを拒否する
?より短い解がある場合
あなたが何をしようとして感謝
管理者だけが閲覧できる管理者ビューがあります。私は専門家を使ってアプリケーションを認可しています。私は、各管理コントローラのポリシーを作成することなく、管理者ビューにすべてのユーザーが、管理者を拒否(およびAUTHORIZEと各コントローラを飾る)どうやっpunditを使用して管理者ビューからユーザを拒否する
?より短い解がある場合
あなたが何をしようとして感謝
は、MVCの性質に違反するとかなり悪い考えです。
あなたはビューで承認することができますが:
# In views
<% if policy(:dashboard).show? %>
<%= link_to 'Dashboard', dashboard_path %>
<% end %>
ザッツビュー全体ではなく、アクションのチャンクを許可するため。
これは、punditのような認証システムは、例外(通常はログインビュー)から救済される「エラー」ページをレンダリングするためにコントローラにキャッチされた例外を発生させるためです。不正なアクションは、別のHTTP応答コードも返す必要があります。ビューのレンダリングがすでに開始されているときにこれを行うのは、応答サイクルの後半にあるため、サーバーがすでに応答を送信し始める可能性があるため、2重レンダリングエラーが発生します。
代わりに、ヘッドレスポリシーを作成することができます
class AdminPolicy < Struct.new(:user, :admin)
def admin?
user.admin?
end
end
をそして、あなたはそうのようにそれを使用することができます:
# app/controllers/concerns/administrated.rb
module Administrated
extends ActiveSupport::Concern
included do
before_action :authorize_admin
end
def authorize_admin
authorize(:admin, :admin?)
end
end
class ThingsController < ApplicationController
include Administrated
end