2016-10-04 1 views
4

У меня был долгий перерыв в моих двухлетних усилиях, пытаясь научиться использовать pundit в моем приложении rails. Я вернулся и пытаюсь научиться пользоваться ученым-консультантом.Rails 5 - как пользоваться Pundit

Я сделал совершенно новое решение для рельсов 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.where), поскольку он находится внутри политики пользователя.

Значением пользователя является текущий пользователь, унаследованный областью применения.

Пример области, которую вы опубликовали, я предполагаю, что вы хотите показывать только текущие записи пользователя. После этого вы можете сделать следующее, как комментарий выше:

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

Кроме того, поскольку вы определили сферу в контроллере

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

Вам не нужно определить еще один в представлении.

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

Это тот или иной. В представлении вы можете просто делать user.each do ....