У меня есть модель Restaurant
, в которой используется геокодер, чтобы собирать город, штат и окрестности по обратному сообщению before_validation
.undefined method `name 'для nil: NilClass для пользовательского slug
class Restaurant < ActiveRecord::Base
# attrs: :name, :address, :city_id, :neighborhood_id
...
before_validation :geocode
geocoded_by :address do |obj,results|
if geo = results.first
obj.city = City.where(name: geo.city).first_or_create
obj.city.update_attributes(state: State.where(name: geo.state).first_or_create)
obj.neighborhood = Neighborhood.where(name: geo.neighborhood).first_or_create
obj.neighborhood.update_attributes(city: City.where(name: geo.city).first_or_create)
obj.longitude = geo.longitude
obj.latitude = geo.latitude
end
end
end
В моей City
модели я соединил пользовательский слизняк, который использует название города и название государства, что оно принадлежит.
class City < ActiveRecord::Base
# attrs :name, state_id
belongs_to :state
friendly_id :state_slug, use: :slugged
def state_slug
"#{name} #{state.name}"
end
end
Всякий раз, когда я создать новый ресторан я ошибка:
undefined method `name' for nil:NilClass
def state_slug
"#{name} #{state.name}"
end
Вполне понятно, потому что это не город или государство, которое до сих пор не сохраняется в базе данных. Мне интересно, как мне настроить мой обратный вызов, чтобы заставить это работать?
ли Вы пытаетесь? '" # {name} # {city.try (: name)} "'? Он будет уверен, что это не сработает, если 'city'' nil' –
Да, но проблема в том, что мне нужно имя города. Выполнение того, что вы описали, даст мне '/ houston' вместо'/houston-texas'. Мне нужен последний из двух. –
Вам нужно имя штата, а не город –