我的javascript发送Ajax请求,它将调用一个控制器函数,然后控制器函数响应Ajax请求。我的问题出在控制器响应部分。
我的javascript向控制器发送Ajax请求:
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//RENDER RESPONSE @cars here
}
}
xmlhttp.open("GET","/cars/reserved_cars/"+customer_id,true);
xmlhttp.send();
因此,上述ajax请求将以CarsController
为参数调用reserved_cars
的{{1}}函数。
我的汽车控制器:
customer_id
我的控制器通过查询带有customer_id的汽车模型获得所有汽车。
一切正常,我只是不知道如何将控制器中的@cars作为我的ajax请求响应到我的javascript(我的javascript中的地方我评论了“ // RENDER RESPONSE @cars here “)
那么,如何在我的javascript中获取@cars响应?
答案 0 :(得分:8)
谢谢大家,我找到了解决方案。
我首先将@cars转换为字符串cars_str
,
然后在我的控制器中使用render :json => cars_str
,
在我的javascript中,我可以使用cars_str
xmlhttp.responseText
字符串
答案 1 :(得分:1)
HTTP协议始终传输字符串,如果您尝试返回数组或其他非标量变量,则会失败。 解决方案是将变量格式化为字符串,然后在JavaScript中解析它。
答案 2 :(得分:0)
您需要编写一个ajax response
类CarsController< BaseController
def reserved_cars
customer_id=params[:customer_id]
@cars = Car.getCars(customer_id)
respond_to do |format|
format.js
end
end
end
在您的汽车视图中,您添加包含javascript的reserved_cars.js.rjs。此文件包含您的javascript代码,如:
page.replace_html :cars, :partial => '/cars/car', :collection => @cars
replace_html将用id cars
替换DOM元素的内部html(例如<div id="cars"></div>
)。部分显示1车
我希望这会有所帮助
答案 3 :(得分:0)
此页
"/cars/reserved_cars/"+customer_id"
需要返回包含文字的页面。然后可以通过访问xmlhttp对象的responseText
来访问此文本。
if (xmlhttp.readyState==4 && xmlhttp.status==200){
//RENDER RESPONSE @cars here
responseFromCar = xmlhttp.responseText;
}
responseFromCar
将是您的请求中返回的文字。然后根据需要解析文本以查找所需的相关信息。
注意:如果您希望从请求中返回格式正确的XML页面,也可以使用responseXML
代替responseText
。这种方法可以使解析更容易。