2015-11-01 18 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"}, 
    # {... 
    # ...] 

如果你希望按特定的順序,這是一個小調整。