【发布时间】:2013-09-01 19:01:53
【问题描述】:
我有一个名为Location 的模型,它在创建时使用地理编码器从坐标中检索地址。然后我有一个 Android 应用程序,它会在我的 locations_controller 的 index 方法中向控制器询问特定点周围的位置列表:
def index
@locations = Location.near([params[:latitude], params[:longitude]], params[:search_radius], :order => :distance)
end
并将结果用 Rabl 格式化为 json 并发送到应用程序:
child :data do
child @location do
attributes :id, :name, :address, :city, :state, :zipcode, :country_name, :latitude, :longitude, :distance
end
end
目前运行良好,:distance 是自动计算出来的。
但是现在我让用户可以在应用程序中创建Location,所以我这样设计了create 方法:
def create
@location = Location.new(params[:location])
if @location.save
@location
else
render :status => :unprocessable_entity,
:json => { :success => false,
:info => @location.errors,
:data => {} }
end
end
创建效果很好,我可以将包含基本信息的 rabl 文件发送给用户,但我的问题是 :distance 没有计算出来。
我想使用与 index 方法相同的 Rabl 模板并添加类似这样的内容,但它不起作用:
node(:distance) { |location| location.distance_to(params[:latitude], params[:longitude]) }
我可以使用 Rabl 文件中的参数来计算它吗?
或者我必须在控制器中执行此操作吗?我需要在模型中添加属性吗?
更新
这是我的Location 模型:
class Location < ActiveRecord::Base
attr_accessible :address, :city, :state, :zipcode, :country_name, :latitude, :longitude, :name
reverse_geocoded_by :latitude, :longitude do |obj,results|
if geo = results.first
obj.address = geo.street_address
obj.city = geo.city
obj.state = geo.state_code
obj.zipcode = geo.postal_code
obj.country_name = geo.country
end
end
after_validation :reverse_geocode
end
【问题讨论】:
-
在创建位置时是否正确计算了距离,之后您又提出了额外的请求?
-
好吧,我没有尝试这样做,因为我想避免我的 Android 应用程序连续向服务器发出两个请求,但我会说一旦进入数据库 Geocoder 就会发现它是的。我会尝试。谢谢!
-
在
@location.save成功后重定向到index而不是返回@location怎么样? -
我明白你的意思,但我可以有一个很大的位置列表,我不值得发回这个列表。不过我也试试,谢谢。我只是认为在同一个请求中有一种简单的方法可以做到这一点,但也许不是!
-
作为一种低门槛的方法,这是我首先想到的如何解决这个问题。至于修复
Location.new返回的对象,这完全取决于你如何计算@location.distance我敢打赌你只是有一个没有在正确的时间触发的钩子。你能发布你的Location模型吗?
标签: ruby-on-rails json rabl