Ruby on rails ActiveRecord:如何向自定义验证错误消息插入属性值?
我有一个Ruby on rails ActiveRecord:如何向自定义验证错误消息插入属性值?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个validates\u presence\u of:pricevalidation,当验证失败时,它返回一个“图书版本价格不能为空”错误 class BookVersion < ActiveRecord::Base attr_accessible :name, :book_id, :instock, :isbn, :price, :famis_price, :famis_number, :weight_in_pounds, :width, :
validates\u presence\u of:price
validation,当验证失败时,它返回一个“图书版本价格不能为空”
错误
class BookVersion < ActiveRecord::Base
attr_accessible :name, :book_id, :instock, :isbn, :price, :famis_price, :famis_number, :weight_in_pounds,
:width, :height, :thickness
validates_presence_of :price, message: "can't be blank"
但是这是返回的
Book version price BookVersion不能为空
,这不是我想要的返回BookVersion的原因是,此时验证的范围是类,而不是要验证的对象。这就是在ActiveModel验证中设置消息的工作方式。如果您真的希望验证按照您的要求进行,您可以编写如下内容:
validates_presence_of :price, message: "#{self.name} can't be blank"
validate :presence_of_price
private
def presence_of_price
errors.add(:price, "for #{self.name} can't be blank") if price.blank?
end
返回BookVersion的原因是,此时验证的范围是类,而不是要验证的对象。这就是在ActiveModel验证中设置消息的工作方式。如果您真的希望验证按照您的要求进行,您可以编写如下内容:
validates_presence_of :price, message: "#{self.name} can't be blank"
validate :presence_of_price
private
def presence_of_price
errors.add(:price, "for #{self.name} can't be blank") if price.blank?
end
一个选项是在模型中执行自己的插值:
after_validation do |record|
record.errors.messages.each do |k, v|
v.each do |message|
message.gsub!(/@{(?<col>[^}]*))}/, __send__(col))
end
end
end
验证后做记录|
记录.errors.messages.each do|k,v|
v、 每个do |消息|
message.gsub!(/{(?[^}]*)}/,发送(col))
终止
终止
终止
因此,除了Ruby插值({…}
)和ActiveModel验证插值(%{…}
)之外,现在还有第三种插值语法-@{…}
的选择是任意的,但是,依我看,它非常适合这种模式
您可以将它放在ActiveRecord::Base中,这样就不需要在每个模型中重复它。当然,这是一种性能成本,因此最好只在需要的地方包含它。一个选项是在模型中进行您自己的插值:
after_validation do |record|
record.errors.messages.each do |k, v|
v.each do |message|
message.gsub!(/@{(?<col>[^}]*))}/, __send__(col))
end
end
end
验证后做记录|
记录.errors.messages.each do|k,v|
v、 每个do |消息|
message.gsub!(/{(?[^}]*)}/,发送(col))
终止
终止
终止
因此,除了Ruby插值({…}
)和ActiveModel验证插值(%{…}
)之外,现在还有第三种插值语法-@{…}
的选择是任意的,但是,依我看,它非常适合这种模式
您可以将它放在ActiveRecord::Base中,这样就不需要在每个模型中重复它。当然,这是有性能代价的,所以最好只在需要的地方包含它。您可能想看看这个方法 因此,您保留您的:
验证:price的存在,消息:“不能为空”
在要显示错误的地方,可以使用类似于Book version{Book\u version.name}{Book\u version.errors.full\u messages.to\u句子}
您可能希望使用符号作为消息(
验证是否存在:price,message::cant\u be\u blank
),这样您就可以在区域设置文件(activerecord.errors.messages.cant\u blank
)中对其进行翻译。您可能需要查看该方法
因此,您保留您的:验证:price的存在,消息:“不能为空”
在要显示错误的地方,可以使用类似于Book version{Book\u version.name}{Book\u version.errors.full\u messages.to\u句子}
您可能希望使用符号作为消息(验证是否存在:price,message::cant\u be\u blank
),这样您就可以在区域设置文件中翻译它(activerecord.errors.messages.cant\u blank
)