2016-01-04 1 views
2

По-видимому, you can't access the params hash в политике штата. Имеет смысл, что они хотят представить как можно меньше информации в политику. Но один случай использования, с которым я столкнулся, который, я думаю, будет довольно распространенным, - проверить, что current_user является пользователем из параметров.Pundit: Убедитесь, что current_user является пользователем из параметров

Так вот мое new действия в моем контроллере:

class ReviewsController < ApplicationController 
    ... 
    def new 
    @user = User.friendly.find(params[:user_id]) 
    unless current_user.admin? || current_user.id == @user.id 
     flash[:alert] = 'Access denied.' 
     redirect_to root_url 
    end 
    @review = @user.reviews.build 
    end 
    ... 
end 

Так вот, я хочу сказать, чтобы разрешить, если пользователь является администратором, или текущий пользователь является таким же, как тот, в URL. В противном случае пользователь с идентификатором 2 может перейти на /users/1/reviews/new.

В этой политике, похоже, нет никакого способа справиться, потому что я не могу передать params[:user_id] в политику.

Есть ли способ обработать эту схему авторизации из политики Pundit, а не обрабатывать логику auth в моем контроллере?

ответ

0

Не уверен, что этот вопрос устарел.

Когда pundit делает авторизацию в контроллере, он пройдет два объекта. Один - record, а другой - current_user. Но вам нужно предоставить только record, когда вы вызываете метод authorize, current_user будет передан автоматически.

#authorize(record, query = nil) ⇒ true

В вашем случае, когда вы звоните authorize(@user, :new?), в вашей политике, @user будут ссылаться как record и current_user будут ссылаться как user.

Поэтому в политике:

class UserPolicy < ApplicationPolicy 
    def new? 
    user.admin? || record == user 
    end 
end 

И вы можете проверить политику в контроллере:

class ReviewsController < ApplicationController 
    ... 
    def new 
    @user = User.friendly.find(params[:user_id]) 
    authorize(@user, :new?) 

    @review = @user.reviews.build 
    end 
    ... 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^