Как я могу интерполировать ivars в строки Rails i18n во время проверки? - PullRequest
4 голосов
/ 23 февраля 2011

Предположим, у меня есть класс модели, подобный этому:

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

И немного yaml:

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 голосов
/ 14 декабря 2012

Вы можете использовать пользовательский метод проверки для достижения того, что вы пытаетесь сделать.Все столбцы доступны в пользовательском валидаторе:

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: После долгих поисков я понял, что реализовать собственный валидатор гораздо проще, чем искать.

0 голосов
/ 25 апреля 2011

Попробуйте удалить опцию сообщения в проверке и измените ваш 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 для более подробной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...