Rails 4 - Pundit - criar política
Estou tentando descobrir como usar o especialista no meu aplicativo Rails 4.
Eu tenho uma visualização de perfil na qual desejo exibir um link para criar um novo projeto, sujeito à autorização do especialista.
Eu tentei cada uma das seguintes formulações:
<%# 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 %>
A associação entre projeto e perfil é:
Projeto
belongs_to :profile
Perfil
has_many :projects, dependent: :destroy
Minha política de projeto tem:
def new?
true
# create?
end
def create?
true
end
quando tento usar esta linha na visualização de perfil:<% if policy(Project).create? %>
Eu recebo um erro que diz:
número errado de argumentos (dado 2, esperado 0)
quando tento usar esta linha na visualização de perfil:<% if policy(@project).create? %>
Eu recebo um erro que diz:
número errado de argumentos (dado 2, esperado 0)
quando tento usar esta linha na visualização de perfil:<% if policy(Projects).create? %>
Eu recebo um erro que diz:
incapaz de encontrar política de zero
quando tento usar esta linha na visualização de perfil:<% if policy(project).create? %>
Eu recebo um erro que diz:
variável local indefinida ou método `project 'para <#: 0x007faf5255d468> Você quis dizer? project_url
Há algo de especial que preciso fazer para testar a autorização do projeto se a página de visualização estiver em um modelo diferente (por exemplo, perfil, autorização de teste para esse perfil para saber se ele pode criar um projeto)? Estou preso e adivinhando como resolver esse problema.
No meu controlador de projetos, eu tenho um método create com:
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
O inicializador da política:
class ProjectPolicy < ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end