【发布时间】:2016-01-31 13:30:05
【问题描述】:
我有一个Restaurant 模型,它使用地理编码器在before_validation 回调中收集城市、州和社区。p>
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 模型中,我组装了一个自定义 slug,它使用城市名称和它所属的州名称。
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。我需要两者中的后者。 -
你需要的是州名,而不是城市名
标签: ruby-on-rails associations geocoding slug friendly-id