Rails 4 - Pundit - создать политику

Я пытаюсь понять, как использовать pundit в моем приложении 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? %>

Я получаю сообщение об ошибке:

невозможно найти политику ноль

когда я пытаюсь использовать эту строку в представлении профиля:<% if policy(project).create? %>

Я получаю сообщение об ошибке:

неопределенная локальная переменная или метод `project 'для <#: 0x007faf5255d468> Вы имели в виду? project_url

Есть ли что-то особенное, что мне нужно сделать, чтобы проверить авторизацию проекта, если страница просмотра находится в другой модели (например, профиль, тестирование авторизации для этого профиля относительно того, может ли он создать проект)? Я застрял и гадал, как решить эту проблему.

В контроллере моих проектов у меня есть метод create с:

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
 Kieran Andrews25 июл. 2016 г., 03:51
Какой файл просмотра является вашимlink_to 'CREATE A PROJECT' в?
 Kieran Andrews25 июл. 2016 г., 04:06
 Kieran Andrews25 июл. 2016 г., 04:05
Вы также можете добавить свойdef show метод, а ваш вызов к вашему частичному?
 Mel25 июл. 2016 г., 04:03
@KieranAndrews - его в профилях / шоу (через частичное в папке профиля с именем _portfolio)
 Mel25 июл. 2016 г., 03:34
@KieranAndrews - я добавил действие создания к сообщению
 Kieran Andrews25 июл. 2016 г., 02:46
Что в твоемdef create метод?
 Mel25 июл. 2016 г., 04:06
проект шоу или профиль шоу? @KieranAndrews

Ответы на вопрос(2)

ваш код может не иметь необходимых переменных экземпляра. Внутри вашего метода показа у вас должен быть @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
 Kieran Andrews25 июл. 2016 г., 07:09
Смотрите мой обновленный ответ
 Mel25 июл. 2016 г., 05:27
Я также утомил формулировку Project.new внутри утверждения if выше. Это не работает - сообщение об ошибке говорит: неправильное количество аргументов (задано 2, ожидается 0)
 Mel25 июл. 2016 г., 10:16
Привет @KieranAndrews - я добавил свой инициализатор политики выше

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

Ваш ответ на вопрос