Rails 4.模型中的国家验证

时间:2014-07-31 11:11:38

标签: ruby-on-rails ruby validation ruby-on-rails-4 model

我正在创建rails API,并希望为包含模型级别的ISO 3166-1代码的国家/地区字段添加验证。

例如,如果使用gem carmen-rails,它只提供帮助country_select。是否可以在模型中使用ISO 3166-1代码的国家验证?

3 个答案:

答案 0 :(得分:5)

您只是想验证输入的国家/地区代码是否合适?这应该与carmen

一起使用
validates :country, inclusion:{in:Carmen::Country.all.map(&:code)}

但如果这就是你所需要的,那么countries gem也可能效果很好。使用countries即可

validates :country, inclusion:{in:Country.all.map(&:pop)}

validate :country_is_iso_compliant

def country_is_iso_compliant
  errors.add(:country, "must be 2 characters (ISO 3166-1).") unless Country[country]
end

<强>更新

对于地区和州,您可以像这样同时验证所有3个。

validates :country, :region, :state, presence: true
validate :location


def location
  current_country = Country[country]
  if current_country
    #valid regions would be something Like "Europe" or "Americas" or "Africa"  etc.
    errors.add(:region, "incorrect region for country #{current_country.name}.") unless current_country.region == region
    #this will work for short codes like "CA" or "01" etc.
    #for named states use current_country.states.map{ |k,v| v["name"}.include?(state)
    #which would work for "California" Or "Lusaka"(it's in Zambia learn something new every day)
    errors.add(:state, "incorrect state for country #{current_country.name}.") unless current_country.states.keys.include?(state)
  else
    errors.add(:country, "must be a 2 character country representation (ISO 3166-1).")
  end
end

虽然地区似乎没必要,因为你可以从像

这样的国家暗示这一点
before_validation {|record| record.region = Country[country].region if Country[country]}

答案 1 :(得分:2)

使用Wikipedia on ISO-3166-1提供的数据创建一个Fixture,并根据该数据验证国家/地区。

您还可以创建一个自动完成功能来简化输入。您可以查看自动完成provided here以获取指导。

答案 2 :(得分:2)

以下是使用countries gem进行验证的最新语法:

validates :country, inclusion: { in: ISO3166::Country.all.map(&:alpha2) }