Rails 4 – Pundit – 制定政策
我正试图弄清楚如何在我的Rails 4应用程序中使用pundit。
我有一个配置文件视图,我想在其中显示一个链接来创建一个新项目,但需要获得权威授权。
我尝试了以下每种配方:
"btn btn-info" %>
项目和简介之间的关联是:
项目
belongs_to :profile
轮廓
has_many :projects, dependent: :destroy
我的项目政策有:
def new? true # create? end def create? true end
当我在配置文件视图中尝试使用此行时:
我收到一条错误消息:
错误的参数数量(给定2,预期为0)
当我在配置文件视图中尝试使用此行时:
我收到一条错误消息:
错误的参数数量(给定2,预期为0)
当我在配置文件视图中尝试使用此行时:
我收到一条错误消息:
无法找到零的政策
当我在配置文件视图中尝试使用此行时:
我收到一条错误消息:
未定义的局部变量或方法`project’for 你的意思是? 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非常相似