我无法访问我的实例变量。我的代码如下:
# 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中使用回调变量。
答案 0 :(得分:0)
我认为你不能用当前的代码。
你jQuery ajax是脱离上下文的,意思是,你从客户端发出ajax,服务器使用=&gt;返回一些数据。 format.json {render :json => @markers}
因此,您完成的回调就可以使用服务器返回的数据,就像您已经完成的那样。
你可以做两件事
从您的操作中渲染部分,可以访问实例变量
def index
# Logic here
render :partial => "locations/location_results"
end
或者您可以为要支持的每种格式创建视图
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
。
在您的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中使用回调变量。