我的ajax调用如何知道我的json在rails中的位置

时间:2015-06-01 07:36:02

标签: ruby-on-rails json

我有一个带有一些ajax的javascript文件,如下所示。

$.ajax({
       type: "GET",
       contentType: "application/json; charset=utf-8",
       url: 'data',
       dataType: 'json',
       success: function (data) {
           draw(data);
       },
       error: function (result) {
           error();
       }
   });

我还在控制器中创建了一个渲染json的方法。

类GraphController< ApplicationController的     def指数     端

def data
  render :json =>  User.select('value').map(&:value)
end
end

所以我的问题是,rails如何知道json的来源,特别是因为我没有从控制器返回物理文件。如果我的文件夹结构中还有一个物理.json文件,会发生什么?是否存在视图如何查找json文件(例如,物理文件> jbuilder文件>控制器操作)的持续性?

2 个答案:

答案 0 :(得分:2)

每个动作都必须呈现一些东西。 您可以显式呈现某些内容,或者rails将查找名称类似于视图中各个控制器文件夹内的操作的页面。 您可以从视图中呈现html.erb,.json,.haml等(前提是您指定响应格式)

如果你正在显式渲染(在你的情况下是真的,就像json那样)Rails不会费心去查看views文件夹。

或者你可以跳过render :json语句并在.json文件中指定该对象,并回复:json。

在您的场景中,您正在渲染一个json对象,该对象将在AJAX函数的数据争论的success:部分中被接受。

答案 1 :(得分:1)

在ajax调用中。contentType: "application/json; charset=utf-8",定义了使用rails查询的请求类型。What that says is, "if the client wants HTML in response to this action, just respond as we would have before, but if the client wants XML, return them the list of people in XML format." (Rails determines the desired response format from the HTTP Accept header submitted by the client.)

看看http://lorenhoward.com/blog/simple-way-integrate-d3-angular/ rails如何响应不同类型的请求-js / xml / html / json

所以你可以在你的控制器中尝试这个..编辑这样的数据动作并尝试..如果调用js / html / xml / json这样的数据就行了,rails会理解需要发送什么类型的响应。

def data

      format.html { redirect_to(user_list_url) }
      format.js
      format.xml  { render :xml => @users.to_xml(:include => @accounts) }
      format.json {render :json =>  User.select('value').map(&:value) }
end

从控制器向视图呈现任何错误..可以这样做: -

   if @user.present?
       format.json {render :json =>  User.select('value').map(&:value) }  
   else
      format.js { render :json => @user.errors.full_messages.join(' '), 
:status => 400 }
    end

在ajax.error函数中使用此视图

.error(function(data) {
                   $("#show_error").html("An Error Occurred,Please try again.");
                  });

希望这有助于