2016-07-28 53 views
2

Rails已經引入了這個throw(:abort)語法,但現在我該如何獲得有意義的銷燬錯誤?Rails 5拋出異常:我如何設置錯誤信息?

驗證錯誤一個會做

if not user.save 
    # => user.errors has information 

if not user.destroy 
    # => user.errors is empty 

這裏是我的模型

class User 

    before_destroy :destroy_validation, 
    if: :some_reason 

    private 

    def destroy_validation 
    throw(:abort) if some_condition 
    end 

回答

11

您可以使用errors.add爲你的類方法。

用戶模型:

def destroy_validation 
    if some_condition 
    errors.add(:base, "can't be destroyed cause x,y or z") 
    throw(:abort) 
    end 
end 

用戶控制器:

def destroy 
    if @user.destroy 
    respond_to do |format| 
     format.html { redirect_to users_path, notice: ':)' } 
     format.json { head :no_content } 
    end 
    else 
    respond_to do |format| 
     format.html { redirect_to users_path, alert: ":(#{@user.errors[:base]}"} 
    end 
    end 
end 
1

Gonzalo S answer是完全沒有問題。 Howerver如果你想要更簡潔的代碼,你可以考慮一個輔助方法。以下代碼在Rails 5.0或更高版本中效果最佳,因爲您可以使用ApplicationRecord模型。

class ApplicationRecord < ActiveRecord::Base 
    self.abstract_class = true 

private 

    def halt(tag: :abort, attr: :base, msg: nil) 
    errors.add(attr, msg) if msg 
    throw(tag) 
    end 

end 

現在你可以這樣做:

class User < ApplicationRecord 

    before_destroy(if: :condition) { halt msg: 'Your message.' } 

    # or if you have some longer condition: 
    before_destroy if: -> { condition1 && condition2 && condition3 } do 
    halt msg: 'Your message.' 
    end 

    # or more in lines with your example: 
    before_destroy :destroy_validation, if: :some_reason 

private 

    def destroy_validation 
    halt msg: 'Your message.' if some_condition 
    end 

end