2017-09-14 112 views
0

我有這個類的方法與rails異常錯誤私人方法。我想,當條件滿足時,我應該被重定向到root_path的通知書,而是,我顯示錯誤信息頁面如何重定向到路徑

class Listing < ApplicationRecord 

    NUMBER_OF_PERMITTED_PHOTOS = 3 
    has_many :photos, dependent: :destroy,before_add: :validate_photo_limit 

    private 

    def validate_photo_limit(photo) 
    raise Exception.new if photos.size >= NUMBER_OF_PERMITTED_PHOTOS 
    end 

end 
+2

的[重定向在模型中的方法捕獲異常]可能的複製(https://stackoverflow.com/questions/4535507/redirect-on-catching-an-exception-in-a-method在這個模型) –

+0

感謝您的答覆。但我不明白。代碼應該如何看起來像 – foliwe83

+0

基本上,如果您將http://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html#method-i-rescue_from放在控制器中,則可以在發生錯誤時運行方法。所以把前兩個代碼塊的版本放入你的應用程序控制器(或任何地方)。不過,您可能會想在模型中引發更具體的錯誤。不要擔心「或者你可以做這樣的事情......」部分。 –

回答

0

我認爲實現這一目標的最優雅的方式是通過創建一個特定的類爲您的錯誤,然後在您的ApplicationController中添加rescue_from語句。

讓我們假設這是你的模型。

class Listing < ApplicationRecord 
    class NumberOfPhotosError < StandardError; end 
    NUMBER_OF_PERMITTED_PHOTOS = 3 
    has_many :photos, dependent: :destroy,before_add: :validate_photo_limit 

    private 

    def validate_photo_limit(photo) 
    raise NumberOfPhotosError.new if photos.size >= NUMBER_OF_PERMITTED_PHOTOS 
    end 
end 

然後,假設你有一個控制器從ApplicationController繼承而來,它應該是這個樣子。當然,如果您不希望將它添加到父控制器,您也可以在特定控制器中使用rescue_from語句。

class ApplicationController < ActionController::Base 
    rescue_from Listing::NumberOfPhotosError do |error| 
    redirect_to(root_path, notice: 'Incorrect number of photos!') 
    end 
end