我的Rails应用程序目前使用 collection_select 为下拉菜单选择查找值等。这有两个好处:
例如: edit.html.erb
<div class="field">
<%= f.label :course_type %><br />
<%= f.collection_select :course_type, Lookup.find(:all,:conditions => ["model_name = 'course' and field_name = 'course_type'"]), :id, :lookup_text, include_blank: false,:prompt => "Course Type" %>
</div>
course_controller.rb
private
def get_lookups
@course = Course.find(params[:id])
@course_type = Lookup.find(@course.course_type).lookup_text
show.html.erb
<b>Course type:</b>
<%= @course_type %>
我的应用程序将是多语言的,Rails通过使用区域设置文件来处理这个问题。
问题是:是否可以(并且明智地)从yml文件而不是模型/表中填充查找值,并且可以轻松扩展以处理多种语言吗?如何用基于yml的代码替换上面的代码?
答案 0 :(得分:6)
一种解决方案是在DB中保留翻译,也许使用我们的Traco lib。我怀疑它适用于collection_select
。
如果您想从翻译YML文件中提取选项,我建议options_for_select
。总而言之:
<强> en.yml 强>
en:
my_options:
one: "Option 1"
two: "Option 2"
查看:强>
select_tag :foo, options_for_select(t("my_options").invert)
如果您翻译非叶键,Rails i18n会为您提供哈希值,例如“my_options”。您需要invert
,因为options_for_select
期望值前面的文本,而翻译哈希是另一种方式。
答案 1 :(得分:1)
要翻译collection_select
,您只需创建一个新的模型方法(例如,“name_translated
”),它会从YAML文件中返回您的翻译:
查看:
<%= f.collection_select :product_id, Product.all, :id, :name_translated %>
型号:
class Product < ActiveRecord::Base
def name_translated
I18n.t(name)
end
end
YAML文件:
en:
name1: "Hammer"
name2: "Plastic sheets"
name3: "Duct tape"
答案 2 :(得分:0)
我使用select:
<%= f.select :role, MAIN_CONFIG['manager_roles'].map { |s| [s.last, s.first] }, selected: @manager.role %>
我的yaml文件main_config.yml:
manager_roles:
admin: 'Суперадмин'
partner_admin: 'Администратор'
manager: 'Менеджер'