【问题标题】:Can collection_select be used against yaml files?可以对 yaml 文件使用 collection_select 吗?
【发布时间】:2012-11-27 16:29:14
【问题描述】:

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

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

例如: 编辑.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的代码呢?

【问题讨论】:

    标签: ruby-on-rails internationalization yaml


    【解决方案1】:

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

    【讨论】:

    • 感谢您提供这两个选项。我会调查 Traco。似乎 options_for_select 会返回一个文本值,然后将其写入数据库字段。来自 3NF 数据库背景,我可以看到一些问题——主要是存储过多的数据。不过我会接受你的回答:谢谢。
    • 这个太复杂了,其实可以用collection_select和.yml翻译(不用DB)。
    • 感谢.invert
    【解决方案2】:

    要翻译您的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"
    

    【讨论】:

    • 如果在数据库更改时需要更改翻译,我仍然建议将翻译存储在数据库中,以降低它们分离的风险。我正在编辑您的答案只是为了稍微澄清一下;如果您介意,请告诉我。
    【解决方案3】:

    我使用选择:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2011-03-04
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多