Почему Rails "errors.full_messages" не заменяет переменные атрибута и сообщения? - PullRequest
22 голосов
/ 06 декабря 2010

Возникла странная проблема с моделью рельсов, которую я только что создал.

Вот мои проверки:

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}}".Любые идеи?

ОБНОВЛЕНИЕ: я удалил рельсы 3 и все драгоценные камни, которые были установлены с ним, и это заставило проблему уйти.Хотя это не исправление ... Я все еще хотел бы установить rails 3.

ОБНОВЛЕНИЕ: Похоже, что обновление до 2.3.9 решает проблему.К сожалению, я уже сдался, но когда-нибудь в будущем я попробую это.

Ответы [ 8 ]

12 голосов
/ 19 января 2011

Я столкнулся с этой проблемой и со старым приложением 2.3.5 Rails, которое я унаследовал.У меня была установлена ​​версия 5.0 i18n gem.Я видел, что ему нужен синтаксис% {}.Сделав это в config / locales / en.yml, добился цели:


en:
  activerecord:
    errors:
      full_messages:
        format: "%{attribute} %{message}"
8 голосов
/ 18 декабря 2010

Обновление до версии 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 голосов
/ 08 декабря 2010

Я исправил локально, удалив 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
1 голос
/ 09 декабря 2011
cd <yourRailsProject> 
gem install i18n -v 0.4.0 -i vendor/ -V

для установки гема i18n в папку vendor (-V для подробного вывода, просто чтобы посмотреть, что происходит под капотом)

1 голос
/ 23 октября 2011

Я работаю на сервере Rails 2.3.5 на работе, у которого нет гема i18n.Странно то, что, хотя мой код работает локально, у меня есть эта проблема на рабочем сервере.И другое приложение, которое я имею с точно такими же замороженными драгоценными камнями, не отображает эту проблему на рабочем сервере.

Я изменил файл activerecord en.yml, как указано выше, но также изменил файл actionpack en.yml, чтобы получить правильный заголовок / заголовок сообщения об ошибке:

   \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)"
1 голос
/ 18 марта 2011

Перейдите в dir_of_ruby / lib / ruby ​​/ gems / 1.8 / gems / activerecord-2.3.x / lib / active_record / locale и отредактируйте en.yml ... заменить {{variable}} на% {variable}

работал для меня ...

PS: может быть, путь будет для вас другим. Адаптируйте для вашего удобства.

1 голос
/ 11 марта 2011

, поэтому я продолжаю видеть обновление рельсов как решение этой

... или вы можете просто понизить i18n до версии 0.4

, как описано в этом посте

получение {{attribute}} {{message}} в представлениях RoR

0 голосов
/ 16 февраля 2011

Вот мой полный config / locales / en.yml, который решает проблемы с атрибутами, сообщениями, количеством и моделью.Я получил это из документов RoR здесь: http://guides.rubyonrails.org/i18n.html

ru: activerecord: errors: full_messages: format: "% {attribute}% {message}" template: header: one: "1 ошибка запрещена,%{модель} от сохранения "other:"% {count} ошибки запретили сохранение этой% {модели} "

...