2017-09-14 71 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