Подтвердить что ты не робот

Почему 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 устраняет проблему. К сожалению, я сейчас отказался, но в будущем я попробую это.

4b9b3361

Ответ 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

Ответ 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} ошибки запретили сохранение этой% {модели}"