如何在验证期间将ivars插入到Rails i18n字符串中?

时间:2011-02-22 23:27:25

标签: ruby-on-rails internationalization interpolation

假设我有一个这样的模型类:

class Shoebox < ActiveRecord::Base
  validates_inclusion_of :description, :in => ["small", "medium"],
    :message => I18n.t("activerecord.errors.models.shoebox.with_name",
                     :name => name)
end

还有一些人:

en:
 activerecord:
  errors:
   models:
    shoebox:
     with_name: "the description of %{name} is not in the approved list"

我创建了一个新的Shoebox:

   s = Shoebox.new(:description => "large", :name => "Bob")
   s.valid?

但是当我看到错误(s.errors.first.message)时,我看到了:

  

“Shoebox的描述不在   批准的清单“

而不是:

  

“鲍勃的描述不在   批准名单“

我已尝试:name => name:name => :name:name => lambda{name}:name => lambda{:name}

我尝试过创建辅助方法

 def shoebox_name
   name
 end

并传递:name => shoebox_name:name => :shoebox_name:name => lambda{shoebox_name}:name => lambda {:shoebox_name}

如何将名称的ivar值插入到字符串中?

2 个答案:

答案 0 :(得分:0)

尝试删除验证中的消息选项,并将您的yaml更改为:

en:
 activerecord:
  errors:
   models:
    shoebox:
     description:
       inclusion: "the description of %{name} is not in the approved list"

有关详细信息,请参阅http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

答案 1 :(得分:-1)

您可以使用自定义验证方法来实现您的目标。所有列都可在自定义验证器中使用:

validate :description_in

def description_in
  if !(["small", "medium"].include?(description))
    errors.add(:base, "The description of #{name} is not in the approved list")
  end
end
PS:经过大量的谷歌搜索后,我意识到实现自定义验证器比搜索更容易。