1

我的 Rails 应用程序当前使用collection_select来选择下拉列表等的查找值。这有两个优点:

  1. 数值一致
  2. 选择值的id存储在数据库中,而不是文本值

例如: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

显示.html.erb

<b>Course type:</b>
<%= @course_type %>

我的应用程序将是多语言的,Rails 使用语言环境文件来处理这个问题。

问题是:是否有可能(并且明智)从 yml 文件而不是模型/表中填充查找值,并且可以轻松扩展以处理多种语言吗?如何将上面的代码替换为基于 yml 的代码?

4

3 回答 3

6

一种解决方案是将翻译保存在数据库中,也许使用我们的Traco库。我怀疑它会与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需要值之前的文本,而翻译哈希则相反。

于 2012-11-27T19:36:11.100 回答
1

要翻译您的collection_select.name_translated

看法:

<%= 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"
于 2015-01-08T17:55:33.590 回答
0

我使用选择:

<%= 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: 'Менеджер'
于 2016-07-08T08:45:59.967 回答