我一直试图想出一种在类中声明数组常量的方法,然后将数组的成员呈现为select控件中的分组选项。我使用数组常量的原因是因为我不希望选项由数据库模型支持。
这可以在基本意义上使用grouped_collection_select视图助手轻松完成。什么不是那么简单,使这个可本地化,同时保持原始数组条目在后台。换句话说,我想以任何语言环境显示选项,但我希望表单提交原始数组值。
无论如何,我想出了一个解决方案,但它看起来过于复杂。我的问题是:有更好的方法吗?是否需要复杂的解决方案,或者我忽略了一个更容易的解决方案?
我将使用一个人为的例子来解释我的解决方案。让我们从我的模型类开始:
class CharacterDefinition < ActiveRecord::Base
HOBBITS = %w[bilbo frodo sam merry pippin]
DWARVES = %w[gimli gloin oin thorin]
@@TYPES = nil
def CharacterDefinition.TYPES
if @@TYPES.nil?
hobbits = TranslatableString.new('hobbits', 'character_definition')
dwarves = TranslatableString.new('dwarves', 'character_definition')
@@TYPES = [
{ hobbits => HOBBITS.map {|c| TranslatableString.new(c, 'character_definition')} },
{ dwarves => DWARVES.map {|c| TranslatableString.new(c, 'character_definition')} }
]
end
@@TYPES
end
end
TranslatableString类执行翻译:
class TranslatableString
def initialize(string, scope = nil)
@string = string;
@scope = scope
end
def to_s
@string
end
def translate
I18n.t @string, :scope => @scope, :default => @string
end
end
视图erb语句如下:
<%= f.grouped_collection_select :character_type, CharacterDefinition.TYPES, 'values[0]', 'keys[0].translate', :to_s, :translate %>
使用以下yml:
en:
character_definition:
hobbits: Hobbits of the Shire
bilbo: Bilbo Baggins
frodo: Frodo Baggins
sam: Samwise Gamgee
merry: Meriadoc Brandybuck
pippin: Peregrin Took
dwarves: Durin's Folk
gimli: Gimli, son of Glóin
gloin: Glóin, son of Gróin
oin: Óin, son of Gróin
thorin: Thorin Oakenshield, son of Thráin
结果是:
那么,我能想出一个合理的解决方案吗?还是我离开了轨道?
谢谢!
答案 0 :(得分:0)
从我回答的响亮的沉默中,我猜测没有更好的方法。无论如何,这种方法是有效的,我会坚持下去,直到我发现更好的东西。