2015-06-01 25 views
0

我有一个javascript文件,其中包含一些ajax,如下所示。我的ajax调用如何知道我的json在rails中的位置

$.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 data 
    render :json => User.select('value').map(&:value) 
end 
end 

所以我的问题是,如何轨知道那里的JSON是从特别是我没有从我的控制器返回一个物理文件来了。如果我的文件夹结构中还有物理.json文件,会发生什么情况?是否有一个视图如何查找json文件(例如物理文件> jbuilder文件>控制器操作)?

+0

在你的情况下输出'User.select('value')。map(&:value)'是以json格式传递的,你不会找到任何.json文件。 –

+0

通过指定render:json => User.select('value')。map(&:value)rails将自动传递json格式的响应。如果你想以特定的格式构建你的json响应,那么你可以使用jbuilder。 –

+0

如果Rails位于'public'中,它只会提供'.json'文件(或任何静态文件)。 – max

回答

1

in ajax call .. contentType: "application/json; charset=utf-8",定义了您使用导轨查询的请求类型。 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.)

看看respond_to api轨如何响应不同类型的请求-js/XML/HTML/JSON

这样你就可以在你的控制器试试这个well..edit这样并尝试数据动作..所有对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 

呈现来自控制器的任何错误view..can就像这样: -

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."); 
        }); 

希望这帮助

+0

这很好。感谢Milind。那么如果我想要返回jbuilder json(它看起来像一个更灵活的方式返回json –

+0

@ SebastianZeki ..我编辑了我的答案...如果它可以帮助你,请把它标记为正确:) – Milind

2

每个动作都必须渲染一些东西。 要么你明确地渲染一些东西,要么rails会查找一个名称类似于视图内相应控制器文件夹内的动作的页面。 您可以从视图中呈现html.erb,.json,.haml等(如果您指定了响应格式)

如果您在显式渲染someting(在您的情况下,为json),Rails不会为打扰查看视图文件夹。

或者,您可以跳过render :json声明并在.json文件中指定该对象,并回应:json。

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

+0

好了,但然后a)我如何在显示的ajax中引用它?我是否将它称为动作名称,如url:'data'和b)如果我在jbuilder中创建json,那么我将控制器动作留空,然后如何在ajax调用中引用该动作?困惑..... –

+0

第一个问题:在URL中,你可以键入'图形/数据''控制器/动作',并且不要忘记在路径中定义它。 第二个问题:有两件事情,如果从行动本身进行显式渲染,那么我认为不需要jbuilder,但是如果该对象足够大,那么jbuilder是一个不错的选择。这http://railscasts.com/episodes/320-jbuilder?view=asciicast将帮助你。 –

+0

谢谢Karan。我看过那个视频,但是它没有提到的一件事是如何从ajax调用jbuilder json。我怎么称呼它?我仍然使用url:data,但确保jbuilder文件与数据视图位于同一个文件夹中(并将其称为data.json.jbuilder)? –

相关问题