是否可以从模型验证中创建选择标记而不会出现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]}) %>
如何使这种语言独立?
答案 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]}
构建数组,您可以将small
,medium
,big
添加到该视图的i18n文件中,以根据验证选项获取本地化值。