2015-08-13 40 views
2

我試圖在權威策略中集中認證而不是在控制器中進行認證。它運行良好,但我在定製重定向和Flash消息方面失去了一些靈活性。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

我剛剛提到了一個定製評論的情況;添加自定義「重定向」路徑的情況經過必要的修改。 – 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和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

良好的工作,謝謝。 –

相關問題