Pundit:一个用户操作中的自定义重定向

时间:2015-08-13 08:33:51

标签: ruby-on-rails redirect pundit

我试图在权威政策中集中认证,而不是在我的控制器中。它运行良好但我在定制重定向和flash消息时失去了一些灵活性。

如何将有关哪些身份验证的信息传递给Pundit :: NotAuthorizedError救援功能?一个动作可以有2个身份验证步骤:1。user.paid? 2. user.is_allowed_to_update?我希望每个案例都有自定义消息和重定向。

exception.query解决方案无效,因为它只允许为每个操作自定义Flash和重定向,而不是在一个操作中。

以下是对情况的更详细解释

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

2 个答案:

答案 0 :(得分: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

这是一个有点笨拙的解决方案,但它对我有用

答案 1 :(得分: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 Pundit :: NotAuthorizedError,使用:: user_not_authorized

之后,您将在控制器中创建两个名为

的私有方法

user_not_authorized和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

虽然这篇文章很老,但我觉得很合适,因为我也需要一个好的答案,但事实并非如此!我希望能帮助