Rails 4 - Pundit - crear política
Estoy tratando de descubrir cómo usar pundit en mi aplicación Rails 4.
Tengo una vista de perfil en la que quiero mostrar un enlace para crear un nuevo proyecto, sujeto a la autorización del experto.
He probado cada una de las siguientes formulaciones:
<%# 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 %>
La asociación entre proyecto y perfil es:
Proyecto
belongs_to :profile
Perfil
has_many :projects, dependent: :destroy
Mi política de proyecto tiene:
def new?
true
# create?
end
def create?
true
end
cuando intento usar esta línea en la vista de perfil:<% if policy(Project).create? %>
Me sale un error que dice:
número incorrecto de argumentos (dado 2, esperado 0)
cuando intento usar esta línea en la vista de perfil:<% if policy(@project).create? %>
Me sale un error que dice:
número incorrecto de argumentos (dado 2, esperado 0)
cuando intento usar esta línea en la vista de perfil:<% if policy(Projects).create? %>
Me sale un error que dice:
incapaz de encontrar la política de cero
cuando intento usar esta línea en la vista de perfil:<% if policy(project).create? %>
Me sale un error que dice:
variable local indefinida o método `proyecto 'para <#: 0x007faf5255d468> ¿Quiso decir? URL del proyecto
¿Hay algo especial que deba hacer para probar la autorización del proyecto si la página de visualización está en un modelo diferente (por ejemplo, perfil, autorización de prueba para ese perfil en cuanto a si puede crear un proyecto)? Estoy atrapado y adivinando cómo resolver este problema.
En mi controlador de proyectos, tengo un método de creación con:
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
El iniciador de la política:
class ProjectPolicy < ApplicationPolicy
attr_reader :user, :record
def initialize(user, record)
@user = user
@record = record
end