如何在我的部分中访问我的实例变量

时间:2016-10-06 06:13:47

标签: ajax ruby-on-rails-4

我无法访问我的实例变量。我的代码如下:

# controllers/locations_controller.rb
def index
  if request.xhr?
    neLat = data.dig('northeast', 'lat').to_f
    neLng = data.dig('northeast', 'lng').to_f
    swLat = data.dig('southwest', 'lat').to_f
    swLng = data.dig('southwest', 'lng').to_f

    @markers = Location
      .where("lat <= ?", neLat)
      .where("lng <= ?", neLng)
      .where("lat >= ?", swLat)
      .where("lng >= ?", swLng)
  end

  respond_to do |format|
    format.html
    format.json {render :json => @markers}
    format.js
  end
end


# view/locations/_map.html.erb
$.ajax({
  url: '/location.json',
  type: 'GET',
  contentType: "application/json; charset=utf-8",
  data: {
    "northeast": bounds.getNorthEast().toJSON(),
    "southwest": bounds.getSouthWest().toJSON(),
  }
})
.done(function(data) {
  // EDIT HERE
  console.log(data)
  console.log(<%= @markers %>)
  // END OF EDIT
  $('.results').html("<%= j render 'locations/location_results' %>")
});

当我的ajax成功完成后,当我调试.log(数据)时,我得到了我的预期结果,但是当我在console.log(&lt;%= @ marker%&gt;)时,我得到了空结果。如何访问我的实例变量?\

编辑:

所以我最终将控制器中的哈希值传递给我的视图:

# controller
renderPartial = render_to_string :partial => 'locations/location_results.html.erb'
respond_to do |format|
  format.html        
  format.json {render :json => {markers: @markers, partial: renderPartial}}
end

# view
.done(function(data) {
  if (data) {
    $('.results').html(data.partial)
    return addMarkers(data.props)
  }
})

这让我可以渲染我的部分并且可以使用erb访问我的实例变量,并且还可以在javascript中使用回调变量。

2 个答案:

答案 0 :(得分:0)

我认为你不能用当前的代码。 你jQuery ajax是脱离上下文的,意思是,你从客户端发出ajax,服务器使用=&gt;返回一些数据。 format.json {render :json => @markers}因此,您完成的回调就可以使用服务器返回的数据,就像您已经完成的那样。

你可以做两件事

  1. 从您的操作中渲染部分,可以访问实例变量

    def index
      # Logic here 
      render :partial => "locations/location_results"
    end
    
  2. 或者您可以为要支持的每种格式创建视图

    def index
      # Logic goes here 
    end
    # Create a file with js extension in your views folder of the corresponding controller 
    # index.js.erb
    # index.html.erb
    # etc
    

    执行此操作时,rails会尝试使用相应的请求格式呈现视图。因此,如果请求的类型为js ajax,则呈现index.js.erb

  3. 在您的index.js.erb中,您可以执行此操作console.log('<%= @markers %>')。基本上你可以在这个文件中编写javascript来操纵你的html。例如,在index.js.erb我也可以这样做

       $('.results').html("<%= j render 'locations/location_results' %>")
       console.log('<%= @markers %>')
    

    希望有帮助:)

答案 1 :(得分:0)

所以我最终将控制器中的哈希值传递给我的视图:

# controller
renderPartial = render_to_string :partial => 'locations/location_results.html.erb'
respond_to do |format|
  format.html        
  format.json {render :json => {markers: @markers, partial: renderPartial}}
end

# view
.done(function(data) {
  if (data) {
    $('.results').html(data.partial)
    return addMarkers(data.props)
  }
})

这让我可以渲染我的部分并且可以使用erb访问我的实例变量,并且还可以在javascript中使用回调变量。