2016-07-25 5 views
0

Rails 4アプリでよく学ぶ方法を理解しようとしています。Rails 4 - Pundit - ポリシーを作成する

私は、プロジェクトを作成するためのリンクを表示したいと考えています。

Iは以下の製剤のそれぞれを試してみました:

<%# if policy(Project.new).create? %> 
          <%# if policy(Project).create? %> 
          <%# if policy(@project).create? %> 
          <%# if policy(Projects).create? %> 
          <% if policy(project).create? %> 


          <%= link_to 'CREATE A PROJECT', new_project_path, :class=>"btn btn-info" %> 
          <% end %> 

プロジェクトとプロファイルとの関連付けがある:

プロジェクト

belongs_to :profile 

プロフィール

has_many :projects, dependent: :destroy 

マイプロジェクトポリシーはあります

def new? 
     true 
     # create? 
    end 

    def create? 
     true 

    end 

私は、プロファイルビューでこのラインを使用してみてくださいとき:<% if policy(Project).create? %>

私が言うエラーが出る:2を与えられた引数の

間違った番号を(、予期しない0)

このプロファイルビューでこの行を試してみると:<% if policy(@project).create? %>

私が言うエラーが出る:私は、プロファイルビューでこのラインを使用しようとすると、引数の

間違った番号

(2を与えられたが、0を予想):<% if policy(Projects).create? %>

Iを

ポリシーが見つからない

私は、プロファイルビューでこのラインを使用してみてください:<% if policy(project).create? %>

私が言うエラーが出る: <#用

未定義のローカル変数やメソッド `プロジェクト」:0x007faf5255d468>はなかったですもしかして? project_url

ビューページが異なるモデル(たとえば、プロファイル、プロジェクトを作成できるかどうかについてのそのプロファイルのテスト許可)の場合、プロジェクト承認をテストするために何か特別なことがありますか?私は立ち往生し、この問題を解決する方法を推測しています。私のプロジェクトのコントローラで

、私はメソッドを作成している:ポリシーの

def create 
    @project = Project.new(project_params) 
    @project.profile = current_user.profile 

    respond_to do |format| 
     if @project.save 
     format.html { redirect_to @project } 
     format.json { render :show, status: :created, location: @project } 
     else 
     format.html { render :new } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

初期化子を:

class ProjectPolicy < ApplicationPolicy 

    attr_reader :user, :record 

    def initialize(user, record) 
    @user = user 
    @record = record 
    end 
+0

あなたの 'def create'メソッドには何がありますか? –

+0

@KieranAndrews - 投稿に投稿アクションを追加しました – Mel

+0

あなたの 'link_to 'CREATE A PROJECT''はどのビューファイルですか? –

答えて

0

あなたのコードが必要なインスタンス変数を持っていないかもしれませんように見えます。あなたのshowメソッドの中に@projectがあるはずです - Punditを使ってユーザーがそれを作成できるかどうかチェックできます。

あなたは@projectを持っているように見えるいけないと、あなたの代わりにこれを試すことができます。

<% if policy(Project.new).create? %> 

をまた代わりにシンボルを使用して試みることができる:

policy(:project) 

<% if policy(:dashboard).show? %> 
    <%= link_to 'Dashboard', dashboard_path %> 
<% end %> 

あなたはそうのように定義されたポリシーを持っていますか? @Kieranへ

<% if policy(:views).items_index? %> 
    <%= link_to("Items", items_path) %> 
<% end %> 

非常によく似:

class ViewPolicy < Struct.new(:user, :views) 

    def items_index? 
     user.has_role?(:sales) 
    end 

end 

は、だから私はこのような何かを行うことができます。

# app/policies/project_policy.rb 
class ProjectPolicy < Struct.new(:user, :project) 
    # ... 
end 
+0

上記のif文の中のProject.new定式化にも疲れました。それは動作しません - エラーメッセージが表示されます:引数の間違った数(与えられた2、期待0) – Mel

+0

私の更新された回答を参照してください –

+0

こんにちは@KieranAndrews - 私は、 – Mel

0

通常、私は別のクラスを使用しますが、ViewPolicyは、ビュー内の目的のために言いますAndrews

関連する問題