[英]Rails 4 - Pundit - create policy
我试图弄清楚如何在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? %>
<% if policy(Project).create? %>
我收到一条错误消息:
参数数目错误(给定2,预期为0)
当我尝试在配置文件视图中使用此行时: <% if policy(@project).create? %>
<% if policy(@project).create? %>
我收到一条错误消息:
参数数目错误(给定2,预期为0)
当我尝试在配置文件视图中使用此行时: <% if policy(Projects).create? %>
<% if policy(Projects).create? %>
我收到一条错误消息:
无法找到零的政策
当我尝试在配置文件视图中使用此行时: <% if policy(project).create? %>
<% if policy(project).create? %>
我收到一条错误消息:
<#:0x007faf5255d468>的未定义局部变量或方法'project'是什么意思? 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
看起来您的代码可能没有必要的实例变量。 在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
通常,出于这个目的,我将使用另一个类,例如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非常相似
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.