【问题标题】:Ruby on Rails YAML configuration designRuby on Rails YAML 配置设计
【发布时间】:2012-08-21 22:03:03
【问题描述】:

我对一个实体有很多静态偏好。我需要将它们存储在数据库表中吗?或者我可以使用 YAML 配置文件,具有大致的结构:

name: "Lights"
descriptions: ""
items: 
  title: "Fog lighs"
  description: "Should be used in foggy environment only!"

  title: "Xenon"
  description: "6500K"

name "Safety"
description: "Safety systems"
items:
  title: "Airbag"
  description: ""

  title: "ABS"
  description: "bla bla bla"

ruby/object model markup。这可以用我上面例子中的嵌套结构来完成吗?

有人能告诉我这样做是否是一个好习惯吗?我不想使用数据库,因为这些设置几乎是静态的,需要更改任何内容的可能性很小。

如果可能的话,我还想知道如何为结构的元素(名称和标题)实现翻译(i18n)。在这种特殊情况下,我不知道该放在哪里。

或者我应该使用完全不同的方法?

【问题讨论】:

    标签: ruby-on-rails database-design configuration model yaml


    【解决方案1】:

    您当然可以在 Rails 应用中使用 YAML,就像在任何 ruby​​ 应用中一样:

    require 'yaml'
    things = YAML::load(open("my_things.yml"))
    

    只需使用现有的 Rails I18n 框架进行翻译。

    例如,给定类:

    class Thing
      attr_accessor :title, :description
    end
    
    class Lights < Thing
    end
    
    class Safety < Thing
    end
    

    以及以下 YAML 数据文件:

    ---
    - !ruby/object:Lights
      title: "Fog lights"
      description: "Should be used in foggy environments only!"
    - !ruby/object:Lights
      title: "Xenon"
      description: "6500K"
    - !ruby/object:Safety
      title: "Airbag"
    - !ruby/object:Safety
      title: "ABS"
      description: "bla bla bla"
    

    您可以在 config/locale/things.nb.yml 中添加翻译:

    nb:
      lights:
        fog_lights:
          title: "Tåkelys"
          description: "Kun til bruk i tåke!"
        xenon:
          title: "Xenon"
          description: "6500K"
      safety:
        airbag:
          title: "Kollisjonspute"
        abs:
          title: "ABS"
          description: "bla bla bla"
    

    当然,其他语言也是如此。现在让我们实现一个描述事物的方法:

    class Thing
      def describe
        key = title.parameterize
        thing = self.class.to_s.downcase
        translated_title = I18n::t("#{thing}.#{key}.title")
        if description
          translated_description = I18n::t("#{thing}.#{key}.description")
        else
          translated_description = ""
        end
        "#{translated_title}: #{translated_description}"
      end
    end
    

    假设当前语言是挪威语,您现在可以这样做:

    things.each do |thing|
      puts thing.describe
    end
    

    然后得到:

    Tåkelys: Kun til bruk i tåke!
    Xenon: 6500K
    Kollisjonspute: 
    ABS: bla bla bla
    

    请注意,您可以从原始 YAML 文件中删除描述标签,或者如果没有可用的翻译,则将它们作为默认后备。

    希望这会有所帮助。

    【讨论】:

    • 哦。顺便一提。我可以以某种方式将此 YAML 文件中的所有项目加载到数组或对象集合中吗?
    • YAML::load(open(filename)) 给你一个包含整个 YML 树的哈希。
    • 好的。但是有没有办法将它们保留为像这里这样的对象:stackoverflow.com/questions/4002092/…
    • 是的,同样的方法应该可以工作。但将其混入 I18n 系统可能不是一个好主意。然后,您应该将对象和翻译分开。
    • 分离的想法对我来说听起来不错,但是怎么做呢?那怎么翻译呢?
    【解决方案2】:

    你应该有:

    en:
      thing1:
        name: "Lights"
        descriptions: ""
       items:
          item1: 
            title: "Fog lighs"
            description: "Should be used in foggy environment only!"
          item2:
            title: "Xenon"
            description: "6500K"
    es:
      thing1:
        name "translation"
        description: "translation"
        items:
          item1:
            title: "translation"
            description: "translation"
          item2:
            title: "translation"
            description: "translation"
    

    【讨论】:

    • 好的!知道了。但是你怎么看,这是一个好习惯吗?翻译呢?
    • 啊。好的!非常感谢您快速准确的回复!
    猜你喜欢
    • 1970-01-01
    • 2016-06-17
    • 2017-07-07
    • 2011-02-13
    • 1970-01-01
    • 2015-02-06
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多