如何基于ruby创建配置文件

时间:2016-10-31 20:05:26

标签: ruby-on-rails ruby

如果每个国家/地区都有自己的省变量逻辑,我如何以更加DSL的方式操纵参数。

我想更好地组织它: - 根据每个国家/地区创建配置文件 - 如果文件不存在,则会有一个默认文件 - 并且每个文件都是一个ruby文件,省级参数可以通过ruby代码进行操作,这样可以提供灵活性。

目前我在控制器中这样做:

before_filter :modify_location_params, :only => [:create]

def location_params
  params.require(:location).permit(
    origin:               [:name, :country, :city, :state, :postal_code, :address1, :address2,:province],
    destination:          [:name, :country, :city, :state, :postal_code, :address1, :address2,:province],
  )
end


def modify_location_params
  [:origin, :destination].each do |location|
    unless (params[:location][location][:country].downcase =~ /(Sweden|sw)/).nil?

      params[:location][location][:province] = 'SW'
    end
    unless (params[:location][location][:country].downcase == 'IL' && some_other_condition == true 

      params[:location][location][:city] = 'OM'
      params[:location][location][:name] = 'some name'
    end
  end
end

是的,我可以在switch / if语句中执行此操作,但我认为由于我有很多国家/地区,因此对于这种操作而言,这将是一种更好的方式来执行类似DSL的系统。任何想法如何实施这样的?

2 个答案:

答案 0 :(得分:1)

我不完全确定我理解你要做的是什么,但是如果你只想为每个国家/地区想要一个类似方法的不同实现,你可以为每个国家创建一个类,让它们从父国家类继承。像

这样的东西
class Country
  def as_origin
    #default code
  end
end

class Sweden < Country
  def as_origin
    #override default code here
  end
end

如果你想避免手工完成这一切,还有很多好的宝石来帮助country information

答案 1 :(得分:0)

如果我理解正确,您希望根据该哈希中的Get-AzureRmWebApp值向哈希添加不同的键值对。如果是这样,那么YAML文件应该可以工作。

假设您在YAML文件中有以下内容

:country

然后你可以定义一个方法

# country_details.yaml
sweden:
    province: 'SW'
il:
    city: 'OM'
    name: 'some name'

你这样使用

def country_details(country)
  parsed_yaml = YAML::load(File.open('path/to/file'))
  details = parsed_yaml[country]
end