使用I18N从验证选项生成选择标记

时间:2012-01-20 18:06:07

标签: ruby-on-rails-3

是否可以从模型验证中创建选择标记而不会出现I18N问题?

例如,如果我有这样的模型:

型号:

class Coffee < ActiveRecord::Base
  SIZES = [ "small", "medium", "big" ]
  validates :size, :inclusion => { :in => SIZES,
    :message => "%{value} is not a valid size" }
end

形式:

<%= f.label :size %><br />  
<%= select(:coffee, :size, Coffee::SIZES.collect {|d| [d, d]}) %>

如何使这种语言独立?

2 个答案:

答案 0 :(得分:5)

处理这种情况的最佳方法是在数据库中使用与语言环境无关的值,在UI上使用本地化标签。您可以通过更改选择的选项来实现这一目标:

<%= select(:coffee, :size, Coffee::SIZES.collect {|d| [I18n.t(d), d]}) %>

并在您的语言环境文件中包含该内容:

some-language:
  small:  "small-translation"
  medium: "medium-translation"
  big:    "big-translation"

这将生成类似的HTML:

<select name="coffee[size]">
  <option value="small">small-translation</option>
  <option value="medium">medium-translation</option>
  <option value="big">big-translation</option>
</select>

用户将在select中看到本地化选项,但在请求参数中将发布与区域设置无关的值,因此您的验证将按预期工作。

答案 1 :(得分:4)

如果您试图使验证消息独立,那么您实际上并不需要提及哪个大小无效,只是确实如此。您正在传递一个HTML选择表单,如果他们选择了另一个大小,那么他们更可能会弄乱某些内容,因此不需要确切的错误消息。

对于选择文本本身,您可以将其传递给i18n系统并在其中处理它。通过使用Coffee::SIZE.collect {|d| [t(".#{d}"), d]}构建数组,您可以将smallmediumbig添加到该视图的i18n文件中,以根据验证选项获取本地化值。