そこで、ユーザー認証ソリューションの評論家を試みることにしました。policy
以下の単純なケースのように、インスタンス変数が nil である可能性があるビューでヘルパーを使用する方法を知りたいです。
アプリ/ビュー/プロジェクト/index.html.slim
h1 Projects
(...)
- if policy(@project).create?
= link_to 'New Project', new_project_path
app/controllers/projects_controller.rb
(...)
def index
@projects = Project.all
end
(...)
アプリ/ポリシー/project_policy.rb
class ProjectPolicy < Struct.new(:user, :project)
def create?
user.has_role? :admin
end
Projects#index ページに「New Project」リンクを表示したいのですが、このビューで使用できる @project インスタンス変数がなく、エラーが発生します。
Pundit::プロジェクトの NotDefinedError#index
のポリシー NilClassPolicy が見つかりません
nil のインスタンス変数を渡すため、明らかにエラーが表示@project
されます。したがって、NilClass は明らかに承認する必要がありません。
この問題を正しく実行するための 2 つの回避策を見つけましたが、いずれも適切ではないようです。
- ビューで既存の @projects 変数を使用します。つまり、次のようになります。
policy(@projects[0])
- このインスタンス変数を定義する行を projects#index コントローラー アクションに追加します。
@project = Project.new
(または上記のようなビューで直接:policy(Project.new)
)
最初の解決策では @projects 配列が空になるという同じエラーが発生し、2 番目の解決策では冗長なインスタンス変数が作成されます。ポリシー ヘルパーが知る必要があるのは、承認ロジックを適用したいクラスだけです。
それを達成するための適切な方法に関する提案はありますか?