2016-07-25 4 views
0

Я пытаюсь выяснить, как использовать pundit в моем приложении Rails 4.Rails 4 - Pundit - создать политику

У меня есть профиль, в котором я хочу отобразить ссылку для создания нового проекта с учетом разрешения на мандатирование.

Я попытался каждый из следующих составов:

<%# 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 получите сообщение об ошибке:

не найдена политика nil

когда я попробовать использовать эту строку в виде профиля: <% 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 - я добавил действие create к сообщению – 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 %> 

ли вы политика определяется как так ?

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

Я тоже устал от Project.new формулировки в выражении if выше. Это не работает - сообщение об ошибке говорит: неверное количество аргументов (задано 2, ожидается 0) – Mel

+0

См. Мой обновленный ответ –

+0

Привет @KieranAndrews - я добавил свой инициализатор политики выше – Mel

0

Обычно я буду использовать другой класс, скажем ViewPolicy, для этой цели в целях:

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

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

end 

Так что я могу сделать что-то вроде этого:

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

очень похож на @Kieran Andrews

Смежные вопросы