繁体   English   中英

Rails 4-Pundit-创建策略

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM