collection_select可以用于对抗yaml文件吗?

时间:2012-11-27 16:29:14

标签: ruby-on-rails internationalization yaml

我的Rails应用程序目前使用 collection_select 为下拉菜单选择查找值等。这有两个好处:

  1. 值一致
  2. 所选值的id存储在数据库中,而不是文本值
  3. 例如: 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的代码替换上面的代码?

3 个答案:

答案 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: 'Менеджер'