【问题标题】:Rails - Use params[] in rabl fileRails - 在 rabl 文件中使用 params[]
【发布时间】:2013-09-01 19:01:53
【问题描述】:

我有一个名为Location 的模型,它在创建时使用地理编码器从坐标中检索地址。然后我有一个 Android 应用程序,它会在我的 locations_controllerindex 方法中向控制器询问特定点周围的位置列表:

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


【解决方案1】:

实际上它比我预期的要简单,如果其他人想知道如何做,我会发布我找到的解决方案。

locations_controllercreate方法中,我创建了一个实例变量来存储distance_to的结果:

@distance_to = @location.distance_to([params[:current_latitude],params[:current_longitude]])

然后在create.json.rabl 我创建了一个node 来显示这个实例变量:

node (:distance_to) { @distance_to }

我真的认为这会比这更困难...... 感谢@rudolph9 的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    相关资源
    最近更新 更多