来自控制器的Ajax响应

时间:2011-02-09 13:53:35

标签: ruby-on-rails ruby-on-rails-3

我的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响应?

4 个答案:

答案 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。这种方法可以使解析更容易。