繁体   English   中英

如何在Rails 4中从一组Yaml文件中选择一个Yaml文件?

[英]How to select one yaml file from a group of yaml files in Rails 4?

我希望能够在名为market的文件夹中选择一个Yaml文件。 此文件夹将位于config / market中。 在此文件夹中,我将有许多yaml文件,例如:

  config/market
        usa.yml
        cad.yml
        eur.yml

在每个yml文件中,我将具有相同的变量,但具有不同的默认值。 例如在usa.yml上

    ---
    :usa
      country: "United States"
      currency: "USD"

对于eur.yml,

    ---
    :eur
     country: "European Union"
     currency: "EUR"

等等。 我想在例如Rails应用程序中使用国家和货币作为全局变量。 根据用户位置,我将选择yaml文件。

当用户登录我的应用程序时,我只希望从市场文件夹中选择一个yaml文件。 也许在应用程序控制器中执行before_action调用。 像这样

 before_action :set_market

 private
   def set_market
     if (statement)
      Config[:market] = :usa
     end
   end

我怎样才能做到这一点? 请任何反馈将有所帮助。

您可以使用YAML类打开文件。 看这个链接: https : //ruby-doc.org/stdlib-2.1.3/libdoc/yaml/rdoc/YAML.html

像这样:

CONFIG = YAML.load_file("#{Rails.root.to_s}/config/market/usa.yml")
CONFIG["usa"]

希望这可以帮助!

添加到MarcusVinnicius的答案中

我建议使用一个具有不同市场/区域的yaml文件。 假设您在使用区域的市场中使用Spree之类的东西。

例如

1.创建一个Yaml文件(settings.yml):

 production:
    united_kingdom:
      countries: ["GB", "IE"]
      currency: GBP
      //shipping ....
      //etc      
    united_states:
      countries: ["US", "PR"]
      currency:  USD
 development:
    united_kingdom:
      countries: ["GB", "IE", "test"]
      currency: GBP
      //shipping ....
      //etc      
    united_states:
      countries: ["US", "PR", "test"]
      currency:  USD

2.加载yaml文件

与上一个答案一样,在控制器上执行操作。


-要么-

做类似的东西这个

  1. 使用以下命令创建初始化程序config/initializers/load_config.rb

     CONFIG_PATH="#{Rails.root}/config/settings.yml" APP_CONFIG = YAML.load_file(CONFIG_PATH)[Rails.env] 
  2. 使用before_filterafter_sign_in/sign_up链接执行以下操作:

    before_filter:set_market_spree_zone

     def set_market_spree_zone market = current_user.market #or if you only have the user country do something like: get_zone_from_country(current_user.country) #convert to abrevation united_stated to us or vice-versa as needed @zone = APP_CONFIG['market'] #then use @zone for Spree or whatever you need to set globally #in the APP end 

(也可以是设备上的after_sign_in或覆盖会话控制器的create方法)

让我知道是否可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM