如何从url params构建AJAX数据?

时间:2016-12-24 19:49:35

标签: ruby-on-rails ajax ruby-on-rails-4 parameters coffeescript

目标:如果没有param存在,请执行查询(这是有效的),但如果存在param则执行不同的查询。

看起来非常简单:传递参数(或不传递),在控制器中检查参数是否存在,如果是,则执行新查询,如果不存在,则执行旧查询。将数据传递到AJAX和coffeescript。

通过查看我的日志,看起来rails使用控制器两次 - 一次是在初始页面加载时,第二次是在它有AJAX数据时。因为它这样做了两次,所以当它第二次出现时我似乎失去了我的参数值。

有关如何解决此问题的任何建议吗?

我的控制器的相关部分

@pId = params[:id]
puts params.inspect
if @pId.present?
  puts "-- Id present --"
  @points = Point
    .select('points.genus, points.species, points.cultivar, points.common_name, types.type_name')
    .where(id: @pId)
    .eager_load(:type)
else
  puts "** Id not present **"
  @points = Point
    .select('points.genus, points.species, points.cultivar, points.common_name, types.type_name')
    .where("types.type_name like 'Tree-%' or types.type_name like 'Shrub-%' or types.type_name like 'Perennial' or types.type_name like 'Fern' or types.type_name like 'Vine-%'")
    .order(:id)
    .eager_load(:type)
end
feature_collection = Point.to_feature_collection @points
@geojson = RGeo::GeoJSON.encode(feature_collection)

respond_to do |format|
  format.json { render json: @geojson }
  format.html
end

我的coffeescript的相关部分

$.ajax
  dataType: 'text'
  url: 'map.json'
  send: () ->
    $('#loading').show()
  complete: () ->
    $('#loading').hide()
  success: (data) ->
    L.geoJSON(JSON.parse(data),
      pointToLayer: plantToMarker)

更新 既然我不是冷药,而且我的脑袋不再模糊,我会再试一次。我怀疑我要么在概念上遗漏了一些页面加载周期,要么我不明白AJAX是如何工作的(也可能,因为这是我第一次使用它)。

如果我使用我的页面显示的URL localhost:3000/map,则加载一个JS库进行映射,而plants_controller.rb会使用我的coffeescript在地图上绘制几百个植物点的结果进行查询。

这工作得很好。当我使用url localhost:3000/map?id=3时,我希望一切都保持不变,除了返回许多点的查询,它应该只返回#3。

我一直认为这将是一次触发的线性过程 - 有点像页面加载,控制器处理和数据生成,js库加载,ajax发送,js完成绘制地图。如果我理解我在日志中看到的内容,我们似乎要经历两次控制器 - 第一次,如果id param存在,它会处理代码。但是,在第二次通过时它没有找到id,并最终加载所有工厂点。我不能为我的生活理解控制器为什么两次访问,以及为什么第二次无法识别id。

@joel我试图实施你的建议而我要么做得不对,要么就是没有帮助

respond_to do |format|
  if @pId.present?
    format.json { render json: @geojson, data: @pId}
  else
    format.json { render json: @geojson }
  end
  format.html
end

0 个答案:

没有答案