2014-07-31 2 views
1

У меня есть таблица UserRails 4. Страна и Регион/Область проверки в модели

create_table :users do |t| 
    t.string :first_name 
    t.string :last_name 
    t.string :country 
    t.string :region 
    t.string :city 

    t.timestamps 
end 

Мне нужно проверить страну и регион, а также проверить делает регион относится к стране. Я использую драгоценный камень countries для проверки страны.

# user.rb

class User < ActiveRecord::Base 

    validates_inclusion_of :country, in:Country.all.map(&:pop), :message => "wrong country format" 

end 

Как я могу использовать проверку для 'области' и проверка делает регион относится к стране

UPDATE

Используя советы @ engineersmnky в

# пользователь.rb

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

    def location 
     current_country = Country[country] 
     if current_country 
     errors.add(:region, "incorrect state for country #{current_country.name}.") unless current_country.map{ |k,v| v["name"]}.include?(region) 
     else 
     errors.add(:country, "must be a 2 character country representation (ISO 3166-1).") 
     end 
    end 

Test это в консоли:

2.1.2 :001 > u = User.new(country:"US", region:"SomeState") 
=> #<User id: nil, first_name: nil, last_name: nil, country: "US", region: "SomeRegion", city: nil, address: nil, zip: nil, phone: nil, company: nil, created_at: nil, updated_at: nil> 
2.1.2 :002 > u.valid? 
NoMethodError: undefined method `map' for #<Country:0x007fefb16dd140> 

Где ошибка? или я понимаю, что-то неправильно :(

+0

это должно быть 'current_country.states.map {| k, v | v ["name"]}. include? (region) 'вам не хватает' состояний' 'Hash' – engineersmnky

ответ

3

Перемещенные из моего предыдущего поста Here

Хотя сейчас я вижу по регионам вы имеете в виду состояние

вы могли бы сделать это, а

#optionally in:lambda{|user| Country[user.country].states.map{ |k,v| v["name"]}} 
#for named states see below for further explanation 

validate_inclusion_of :region, in:lambda{ |user| Country[user.country].states.keys}, if: lambda{ |user| Country[user.country]} 

Для страны и Регион/Состояние, которое вы можете подтвердить как в то же время, так и в этом случае.

validates :country, :region, presence: true 
validate :location_by_country 


def location_by_country 
    current_country = Country[country] 
    if current_country 
    #this will work for short codes like "CA" or "01" etc. 
    #for named regions use: 
    # current_country.states.map{ |k,v| v["name"]}.include?(region) 
    #which would work for "California" Or "Lusaka"(it's in Zambia learn something new every day) 
    #for Either/Or use: 
    # current_country.states.map{|k,v| [k,v["name"]]}.flatten 
    #this will match "California" OR "CA" 

    errors.add(:region, "incorrect region for country #{current_country.name}.") unless current_country.states.keys.include?(region) 
    else 
    #optionally you could add an error here for :region as well 
    #since it can't find the country 

    errors.add(:country, "has wrong country format") 
    end 
end 
+0

У меня есть ошибка' undefined method 'map ''. Пожалуйста, посмотрите на вопрос обновления – Derk153

+0

@ Derk153 он должен быть 'current_country.states.map {| k, v | v ["name"]}. include? (region) 'вам не хватает' состояний' 'Hash' – engineersmnky

+0

Спасибо большое! Отличный ответ, отличное решение. Я люблю тебя, чувак, ты потрясающий! – Derk153

Смежные вопросы