Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord:如何向自定义验证错误消息插入属性值?_Ruby On Rails_Activerecord - Fatal编程技术网

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