Почему Rails "errors.full_messages" не заменяет переменные атрибута и сообщения?
Имея странную проблему с моделью рельсов, которую я только что создал.
Вот мои подтверждения:
validates_presence_of :from_name, :message => 'Please provide a from name.'
validates_presence_of :from_email
validates_presence_of :giftition_plan_id
У меня возникают проблемы с использованием errors.full_messages
, а также f.error_messages
в моей форме:
g = Giftition.create
g.errors.first
=> ["from_name", "Please provide a from name."]
>> g.errors.full_messages
=> ["{{attribute}} {{message}}", "{{attribute}} {{message}}", "{{attribute}} {{message}}"]
Я просто получаю "{{attribute}} {{message}}"
. Любые идеи?
UPDATE: я удалил рельсы 3 и все драгоценные камни, которые были установлены вместе с ним, и это заставило проблему уйти. Это не исправление, хотя... Я все равно хотел бы установить рельсы 3.
UPDATE: похоже, что обновление до версии 2.3.9 устраняет проблему. К сожалению, я сейчас отказался, но в будущем я попробую это.
Ответы
Ответ 1
Обновление до версии rails 2.3.9 устраняет эту проблему
gem install -v 2.3.9 rails --include-dependencies
EDIT:
Вам также нужно отредактировать файл config\environment.rb
, чтобы изменить RAILS_GEM_VERSION
.
RAILS_GEM_VERSION = '2.3.9'
ИЗМЕНИТЬ № 2:
Я должен отметить, что версия 2.3.9 - это не последняя версия ветки 2.3.X, и вы должны обновить последнюю доступную версию.
Ответ 2
Я столкнулся с этой проблемой также со старым приложением 2.3.5 Rails, которое я унаследовал. У меня была версия 5.0 для i18n gem. Я видел, что ему нужен синтаксис% {}. Выполнение этого в config/locales/en.yml выполнило трюк:
en:
activerecord:
errors:
full_messages:
format: "%{attribute} %{message}"
Ответ 3
Я фиксировал локально, удалив i18n-0.5.0.
эксперимент с выводами i18n-0.4.0 (при возврате правильно интерполированной строки):
The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead.
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:160:in `interpolate_without_deprecated_syntax'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:155:in `gsub'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:155:in `interpolate_without_deprecated_syntax'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:188:in `preserve_encoding'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:154:in `interpolate_without_deprecated_syntax'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/i18n_interpolation_deprecation.rb:21:in `interpolate'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:48:in `translate'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n.rb:152:in `translate'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:119:in `resolve'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:104:in `default'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:103:in `each'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:103:in `default'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n/backend/base.rb:41:in `translate'
/usr/lib/ruby/gems/1.8/gems/i18n-0.4.0/lib/i18n.rb:152:in `translate'
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.5/lib/active_record/validations.rb:78:in `generate_message'
Я думаю, 0.5.0 вызывает боль, выводя неинтерполированные строки.
i18n требуется activesupport, поэтому способ загрузки последней версии (0.5.0):
в config/preinitializer.rb( "секретный" крюк жизненного цикла, который загружается до активации activesupport):
require 'rubygems'
begin
gem 'i18n', "~> 0.4.0"
rescue LoadError
# no biggie, optional anyway
end
Ответ 4
поэтому я продолжаю видеть обновляющие рельсы в качестве решения этой
... или вы можете просто понизить i18n до версии 0.4
как указано в этом сообщении
получение {{attribute}} {{message}} в представлениях RoR
Ответ 5
Перейдите в каталог dir_of_ruby/lib/ruby /gems/1.8/gems/activerecord-2.3.x/lib/active_record/locale и отредактируйте en.yml... замените {{variable}} на% {variable}
Работал для меня...
PS: может быть, путь будет другим для вас. Адаптируйте для удобства.
Ответ 6
Я работаю над сервером Rails 2.3.5 на работе, у которого нет i18n gem. Странно то, что, хотя мой код работает локально, у меня есть эта проблема на рабочем сервере. И другое приложение, которое у меня есть с такими же замороженными драгоценными камнями, не отображает эту проблему на рабочем сервере.
Я изменил файл activ.ecl файла activerecord, как указано выше, но также изменил файл action.png actionpack, чтобы получить заголовок/заголовок сообщения об ошибке:
\vendor\rails\activerecord\lib\active_record\locale\en.yml
#format: "{{attribute}} {{message}}"
format: "%{attribute} %{message}"
\vendor\rails\actionpack\lib\action_view\local\en.yml
activerecord:
errors:
template:
header:
one: "1 error prohibited this %{model} from being saved"
other: "%{count} errors prohibited this %{model} from being saved"
Кроме того, я не беспокоился об этом, но если у вас есть сообщения об ошибках, содержащие подсчеты, похоже, что в файле activerecord en.yml вам нужно изменить синтаксис некоторых сообщений тоже (например):
#too_long: "is too long (maximum is {{count}} characters)"
too_long: "is too long (maximum is #{count} characters)"
Ответ 7
cd <yourRailsProject>
gem install i18n -v 0.4.0 -i vendor/ -V
установить i18n gem в папку поставщика (-V для подробного вывода, просто чтобы узнать, что происходит под капотом)
Ответ 8
Здесь моя полная config/locales/en.yml, которая решает проблемы с атрибутом, сообщением, счетчиком и моделью. Я получил это из документов RoR здесь: http://guides.rubyonrails.org/i18n.html
ан: ActiveRecord: ошибки: full_messages: format: "% {attribute}% {message}" шаблон: заголовок: один: "1 ошибка запретила сохранение этой% {модели} other:" % {count} ошибки запретили сохранение этой% {модели}"