2016-10-04 1 views
4

J'ai eu une longue pause de mes 2 années d'efforts pour essayer d'apprendre à utiliser l'application pundit dans mes rails. Je suis de retour et j'essaie d'apprendre à utiliser Pundit.Rails 5 - comment utiliser Pundit

J'ai fait une application entièrement nouvelle rails 5 et pundit installé.

J'ai une ressource utilisateur, une politique d'application et une politique d'utilisateur. Chacun a:

utilisateurs contrôleur:

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

Application de la politique

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 

Conditions d'utilisation

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


end 

Puis dans mon index de l'utilisateur, je suis en train de suivre les instructions les docs pundit gem, en faisant:

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

Je reçois cette erreur:

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' 

Quelqu'un peut-il voir comment je descendre au mauvais départ? Je n'ai même pas essayé de définir ma portée de la façon dont je veux encore, mais cela ne fonctionne pas à ce stade.

+1

Peut-être que vous vouliez dire 'scope.where (id: user.try (: id))'? – slowjack2k

Répondre

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

0. La valeur de la classe User (user.where), car elle fait partie de la politique de l'utilisateur.

La valeur utilisateur est l'utilisateur actuel, hérité par la portée de l'application.

L'exemple d'étendue que vous avez posté, je suppose que vous souhaitez afficher uniquement les enregistrements d'utilisateurs en cours. Ensuite, vous pouvez effectuer les opérations suivantes comme le commentaire ci-dessus:

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

aussi parce que vous avez défini un champ dans le contrôleur

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

Vous n'avez pas besoin de définir un autre dans la vue.

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

C'est l'un ou l'autre. Dans la vue, vous pouvez simplement faire users.each faire ....