为什么Rails的“errors.full_messages”不替换属性和消息变量?

我刚刚创建的rails模型有一个奇怪的问题。

以下是我的validation:

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中的errors.full_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}}" 。 有任何想法吗?

更新:我已经卸载了rails 3以及随之安装的所有gem,这使问题消失了。 虽然这不是一个修复…我仍然希望安装rails 3。

更新:听起来像升级到2.3.9修复了问题。 不幸的是,我现在已经放弃了,但将来的某个时候我会尝试。

升级到版本rails 2.3.9修复了此问题

 gem install -v 2.3.9 rails --include-dependencies 

编辑:

您还需要编辑config\environment.rb文件以更改RAILS_GEM_VERSION

 RAILS_GEM_VERSION = '2.3.9' 

编辑#2:

我应该注意,版本2.3.9不是2.3.X分支的最新版本,您应该升级可用的最新版本。

我还使用我inheritance的旧版2.3.5 Rails应用程序遇到了这个问题。 我安装了5.0版本的i18n gem。 我看到它需要%{}语法。 在config / locales / en.yml中执行此操作就可以了:

 en: activerecord: errors: full_messages: format: "%{attribute} %{message}" 

我通过删除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通过输出非插值字符串来解决痛苦。


主动支持需要i18​​n,所以我加载最新版本(0.5.0)的方式是:

在config / preinitializer.rb(在activesupport之前加载的’secret’生命周期钩子):

 require 'rubygems' begin gem 'i18n', "~> 0.4.0" rescue LoadError # no biggie, optional anyway end 

所以我一直看到升级rails作为解决方案

…或者你可以简单地将i18n降级到版本0.4

如本文所述

在RoR视图中获取{{attribute}} {{message}}

转到dir_of_ruby / lib / ruby​​ / gems / 1.8 / gems / activerecord-2.3.x / lib / active_record / locale并编辑en.yml …将{{variable}}替换为%{variable}

为我工作……

PS:也许路径对你来说会有所不同。 适应您的方便。

 cd  gem install i18n -v 0.4.0 -i vendor/ -V 

将i18n gem安装到vendor文件夹中(-V用于详细输出,只是为了查看引擎盖下发生了什么)

我正在开发一个没有i18n gem的Rails 2.3.5服务器。 奇怪的是,虽然我的代码在本地工作,但我在工作服务器上遇到了这个问题。 而且,我使用相同的冷冻gem的另一个应用程序不会在工作服务器上显示此问题。

我更改了上面的activerecord en.yml文件,但也更改了actionpack en.yml文件以获取错误消息title / header right:

  \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)" 

这是我完整的config / locales / en.yml,它解决了属性,消息,计数和模型问题。 我从这里的RoR文档得到了这个: http : //guides.rubyonrails.org/i18n.html

en:activerecord:errors:full_messages:format:“%{attribute}%{message}”template:header:one:“1错误禁止此%{model}被保存”其他:“%{count}错误禁止此% {model}被保存“