Rails 5 抛出中止:如何设置错误消息?
Rails 5 throw abort : how do I setup error messages?
Rails 引入了这种 throw(:abort)
语法,但现在如何获得有意义的销毁错误?
对于验证错误,一个人会这样做
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
您可以使用 errors.add
作为您的 class 方法。
用户模型:
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
完全没问题。但是,如果您想要更简洁的代码,可以考虑使用辅助方法。以下代码在 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
Rails 引入了这种 throw(:abort)
语法,但现在如何获得有意义的销毁错误?
对于验证错误,一个人会这样做
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
您可以使用 errors.add
作为您的 class 方法。
用户模型:
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
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