2016-10-04 35 views
4

我已经从我2年的努力中尝试了解如何在我的rails应用程序中使用pundit进行了长时间的休息。我回来了,并试图学习如何使用专家。Rails 5 - 如何使用Pundit

我做了一个全新的rails 5应用程序并安装了专家。

我有一个用户资源,一个应用程序策略和一个用户策略。每个人都有:

用户控制器:

def index 
    # @users = User.all 
    @users = policy_scope(User) 
    end 

应用策略

class ApplicationPolicy 
    attr_reader :user, :record 

    def initialize(user, record) 
    @user = user 
    @record = record 
    end 

    def index? 
    true 
    end 

    def show? 
    scope.where(:id => record.id).exists? 
    end 

    def create? 
    false 
    end 

    def new? 
    create? 
    end 

    def update? 
    false 
    end 

    def edit? 
    update? 
    end 

    def destroy? 
    false 
    end 

    def scope 
    Pundit.policy_scope!(user, record.class) 
    end 

    class Scope 
    attr_reader :user, :scope 

    def initialize(user, scope) 
     @user = user 
     @scope = scope 
    end 

    def resolve 
     scope 
    end 
    end 
end 

用户策略

class UserPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     scope.where(user: user) 
    end 
    end 


end 
在我的用户索引

于是,我试图按照指示权威宝石文档,通过这样做:

<% policy_scope(@users).each do |user| %> 

我得到这个错误:

PG::UndefinedColumn: ERROR: column users.user does not exist 
LINE 1: SELECT "users".* FROM "users" WHERE "users"."user" = '566119... 
              ^
: SELECT "users".* FROM "users" WHERE "users"."user" = '566119d2-54d8-4ab2-b7c5-f17c80b517f3' AND "users"."user" = '566119d2-54d8-4ab2-b7c5-f17c80b517f3' 

任何人都可以看到我是如何下车到错误的开始?我甚至没有试图以我想要的方式来定义我的范围,但现在它不起作用。

+1

也许你的意思是'scope.where(id:user.try(:id))'? – slowjack2k

回答

1
class UserPolicy < ApplicationPolicy 
    class Scope < Scope 
    def resolve 
     scope.where(user: user) 
    end 
    end 
end 

scope.where表示User类(user.where),因为它在用户策略中。

用户值是当前用户,由应用程序范围继承。

您发布的范围示例我猜测您只想显示当前用户记录。此外,因为你已经在控制器

def index 
    # @users = User.all 
    @users = policy_scope(User) 
end 

你并不需要定义另一个视图定义的范围

scope.where(id: user.try(:id)) 

:那你可以做以下如上评论。

<% policy_scope(@users).each do |user| %> 

它是这样或那样的。在视图中,你可以简单地做users.each的操作....

相关问题