2015-11-01 21 views
1

我目前的配置格式似乎很冗余。我怎么能把它转换成下一个预期的配置格式?我如何删除Ruby DSL中的重复部分

我预期的配置是:

MoneyRails.configure do |config| 

    register_currency("TWD", 100) 
    register_currency("USD", 100) 
    .... 
end 

我现在的配置是:

MoneyRails.configure do |config| 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "TWD", 
    :name    => "TWD", 
    :symbol    => "NT$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "USD", 
    :name    => "USD", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "SGD", 
    :name    => "SGD", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "THB", 
    :name    => "THB", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "AUD", 
    :name    => "AUD", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    config.register_currency = { 
    :priority   => 1, 
    :iso_code   => "KRW", 
    :name    => "KRW", 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
    } 

    ... 

end 
+0

欢迎来到Stack Overflow。当你试图从目前的版本降低到你想要的版本时会发生什么?我没有看到任何问题,只是一个愿望清单。我们希望看到您试图做的事以及您为何无法正常工作的解释。 –

回答

1
default_options = { 
    :priority   => 1, 
    :iso_code   => 'USD', 
    :name    => 'USD', 
    :symbol    => "$ ", 
    :symbol_first  => true, 
    :subunit    => "Subcent", 
    :subunit_to_unit  => 100, 
    :thousands_separator => ",", 
    :decimal_mark  => "." 
} 

MoneyRails.configure do |config| 
    config.register_currency = default_options 
    config.register_currency = default_options.merge(name: 'TWD', iso_code: 'TWD', symbol: 'NT$') 
    config.register_currency = default_options.merge(name: 'THB', iso_code: 'THB') 
    config.register_currency = default_options.merge(name: 'SGD') 
end 

merge方法合并两个哈希实例并返回一个Hash对象。如果第二个哈希对象有一些与第一个哈希匹配的键,那么第二个哈希的key => value替换/覆盖前一个。

1

有关创建这个小模块是什么?你只需要添加一个额外的属性与你的配置对象:

module MoneyRails 
    module MyApp 
    def register_currency(config, name, subunit_to_unit) 
     config.register_currency(options_hash(name, subunit_to_unit)) 
    end 

    private 

    def options_hash(name, subunit_to_unit) 
     { 
     :priority   => 1, 
     :iso_code   => name, 
     :name    => name, 
     :symbol    => "$ ", 
     :symbol_first  => true, 
     :subunit    => "Subcent", 
     :subunit_to_unit  => subunit_to_unit, 
     :thousands_separator => ",", 
     :decimal_mark  => "." 
     } 
    end 
    end 
end 

注意我命名空间它,以不污染基地命名空间。改变你的休闲。

然后:

include MoneyRails::MyApp 

MoneyRails.configure do |config| 

    register_currency(config, "TWD", 100) 
    register_currency(config, "USD", 100) 
    .... 
end 
+1

你正在通过'class'方法访问'instance'方法 – illusionist

+0

@illusionist你是对的!固定 – dgilperez

0

只有相对少数的例外情况,所以我倾向于将它们放在一个文件中,每个货币一行,并附上货币名称缩写。例如,一个线可能是:

TWD SYM:"NT$ " 

(或TWD SYM:NT$如果:symbol所有值都具有在一端的空间)。

大部分线路将只有货币缩写,如:

USD 

你会然后读取并解析该文件到一个数组,如下列:

specific_bits = [ 
    ["TWD", { symbol: "NT$ " }], 
    ["USD", {}], 
    ["SGD", {} ], 
    ["THB", { subunit_to_unit: 999 }], 
    ["AUD", {}], 
    ["KRW", {}], 
    ["XYZ", { symbol: "XT$ ", subunit_to_unit: -5 }], 
] 

然后定义:

BASE_HASH = { 
    priority:   1, 
    symbol:    "$ ", 
    symbol_first:  true, 
    subunit:    "Subcent", 
    subunit_to_unit:  100, 
    thousands_separator: ",", 
    decimal_mark:  "." 
} 

这使您可以非常简单地构建哈希表:

specific_bits.map do |name, exceptions| 
    h = { :iso_code => name, :name => name } 
    exceptions.each { |k,v| h[k] = v } 
    BASE_HASH.merge h 
end 
    #=> [{:priority=>1, :symbol=>"NT$ ", :symbol_first=>true, :subunit=>"Subcent", 
    # :subunit_to_unit=>100, :thousands_separator=>",", :decimal_mark=>".", 
    # :iso_code=>"TWD", :name=>"TWD"}, 
    # {... 
    # ...] 

如果你希望按特定的顺序,这是一个小调整。