2015-08-13 3 views
2

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

Как я могу передать информацию о том, какая аутентификация не перешла на функцию спасения Pundit :: NotAuthorizedError? Одно действие может состоять из двух шагов аутентификации: 1. user.paid? 2. user.is_allowed_to_update? и я хочу, чтобы пользовательское сообщение и перенаправление для каждого случая.

Решение exception.query не работает, поскольку оно позволяет настраивать вспышку и перенаправление для каждого действия, а не в течение одного действия.

Ниже приводится более подробное объяснением ситуации

WITHOUT PUNDIT 
Comment_Controller 
def update 
    if user.didnt_pay? 
     flash[:message] = nice_message 
     redirect_to payment_page_path 
    elsif user.is_not_allowed_to_perform_action 
     flash[:message] = less_nice_message 
     redirect_to dashboard_path 
    end 
end 

А теперь

WITH PUNDIT 
Comment_Controller 
def update 
    authorize @comment 
end 

Comment_policy 
def update? 
    user.paid? && user_is_allowed_to_perform_action 
end 

ApplicationController 
rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized 
def user_not_authorized 
    flash[:message] = one_message_for_all_error # THIS IS WHAT I WANT TO CUSTOMIZE 
    redirect_to one_path_for_all_error # THIS IS WHAT I WANT TO CUSTOMIZE 
end 

ответ

1

Возможность для настройки этих сообщений об ошибке, это установить ожидаемое сообщение в Policy, а затем получить его от контроллер. Как это сделать?

exception объект, который вы получите в качестве аргумента в контроллере

class CommentsController < ApplicationController 

    def user_not_authorized(exception) 
    end 
end 

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

class AnimalPolicy < ApplicationPolicy 
    attr_accessor :error_message 

    def new? 
    if !authorization_clause 
     @error_message = "Something terrible happened" 
     false 
    else 
     true 
    end 
    end 
end 

Таким образом, в вашем контроллере, вы должны установить этот error_message в свой flash или туда, куда вы хотите его быть:

class CommentsController < ApplicationController 

    def user_not_authorized(exception) 
    flash[:error] = exception.policy.try(:error_message) || "Default error message" 

    redirect_to root_path 
    end 
end 

это неуклюжее решение немного, но он работал на меня

+0

Я только что упомянул случай индивидуального комментария; случай добавления пользовательского пути перенаправления следует mutatis mutandis. – geekazoid

0

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

def update 

    if user.didnt_pay? 

     authorize @comment 
     user_congratulation 

    elsif user.is_not_allowed_to_perform_action 

     user_not_authorized 

    end 

end 

в ApplicationController

мимо этого rescue_from Пандиту :: NotAuthorizedError, с:: user_not_authorized

и после того, как вы создадите в своем контроллере два частных метода:

user_not_authorized and user_congratulation

private 

    def user_not_authorized 
     flash[:alert] = "less_nice_message" 
     redirect_to dashboard_path 
    end 


    def user_congratulation 
     flash[:alert] = "nice_message" 
     redirect_to payment_page_path 
    end 

    end 

для получения дополнительной информации перейдите по этой ссылке https://github.com/elabs/pundit#rescuing-a-denied-authorization-in-rails

Хотя этот пост старый, я счел нужным ответить, потому что я был также нуждается в хороший ответ, который был не так!Я надеюсь, что помог

+0

Пожалуйста, уделите время правильному форматированию кода. –

+0

Я сделал это ** спасибо ** – tnbsoftlab

+0

Хорошая работа, спасибо. –

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