2010-01-18 75 views
118

假设你在你的用户控制器中,并且你希望得到一个显示请求的json响应,如果你可以在你的views/users/dir中创建一个名为show.json的文件,并且你的用户#show动作完成后,呈现文件。在Rails中,如何使用视图呈现JSON?

目前,你需要做的线沿线的东西:

def show 
    @user = User.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json{ 
     render :json => @user.to_json 
    } 
    end 
end 

但是,这将是很好,如果你可以只创建自动获取呈现像这样一个show.json文件:

def show 
    @user = User.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json 
    end 
end 

这将为我节省大量的悲痛,并将冲走当我在控制器中呈现我的json时得到的可怕肮脏的感觉

+0

现在看这篇文章,看起来这不会节省我很多,但我有更复杂的情况下,相信我,当我说这让我头痛 – Matthew 2010-01-18 18:33:58

+1

在Rails 3中,你可以调用'format.json'一个'show.json.erb'文件。看到我的答案。 – 2012-12-30 17:13:34

回答

61

你应该能够做一些事情,在你respond_to块:

format.json render :partial => "users/show.json" 

将呈现模板中app/views/users/_show.json.erb

+5

这很好,但你会很快发现erb是一种生成json的痛苦方式。看看我的答案一些替代品。 – tybro0103 2013-10-07 15:08:39

+1

有没有办法做到这一点,而不使用局部? – 2016-07-23 07:02:50

53

尝试添加视图users/show.json.erb这应该被渲染,当你做了JSON格式的请求,你会得到它正在由雇员再培训局提供的额外的好处,这样你的文件可能是这个样子

{ 
    "first_name": "<%= @user.first_name.to_json %>", 
    "last_name": "<%= @user.last_name.to_json %>" 
} 
+9

您可能想使用'@ user.first_name.to_json'而不是'escape_javascript'。 JS允许的内容和* strict * JSON之间存在一些细微差别。 (当浏览器实现自己的JSON解析器时,这些差异变得越来越重要。) – 2010-01-18 21:17:42

+0

感谢您的建议;我更新了答案。 – erik 2010-01-18 21:20:43

+1

您应该将单引号更改为双引号,因为JSON(不像JS)只接受双引号字符串。 – 2012-01-20 20:27:33

9

只需添加show.json.erb文件与内容

<%= @user.to_json %> 

有时它是有用的,当你需要一些额外的辅助方法不在控制器可用,即image_path(@user.avatar)或某事产生额外的在JSON属性:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %> 
+7

它将需要'<%= raw(@ user.to_json)%>'以避免HTML转义。我所做的只是依赖于to_json,只要它给我我想要的东西,但是当我想要做其他事情时,我会使用通常是'{:blah => @ user.the_blah} .to_json'的模板。 – clacke 2011-11-08 07:51:07

27

Rabl的可能是这个最好的解决办法,如果你正在寻找一个更清洁的替代方案,我见过ERb语法。 json_builder和argonaut,这些都是其他解决方案,都显得有点过时,并且在没有补丁的情况下无法使用Rails 3.1。

RABL可通过gem或检查GitHub存储库;很好的例子太

https://github.com/nesquena/rabl

21

只是为了更新这个答案对于其他人谁发生落得此页面上的缘故。

在Rails 3中,您只需要在views/users/show.json.erb创建一个文件。 @user对象将可用于视图(就像它将用于html)。您甚至不需要to_json了。

总之,它只是

# users contoller 
def show 
    @user = User.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.json 
    end 
end 

/* views/users/show.json.erb */ 
{ 
    "name" : "<%= @user.name %>" 
} 
+1

我在1.5年前回答了这个问题。现在我只需要使用respond_with,只要我需要JSON,例如'respond_with @user,只有:[:name]'。有关更多信息,请参阅本教程(http://bendyworks.com/geekville/tutorials/2012/6/respond-with-an-explanation)。 – 2013-05-24 18:44:45

+1

只是添加到这个答案,这实际上是危险的,原因有两个:它允许从用户数据进行注入,因为它不会转义换行符和反斜杠,并且<%= html也会转义数据,例如肖恩奥康纳将他的名字玷污肖恩O '康纳。 – d4n3 2015-09-04 09:56:18

28

正如其他人所说,你需要一个用户/节目。JSON视图,但也有可供考虑的模板语言...

ERB

开箱的。非常适合HTML,但是你很快就会发现JSON很糟糕。

RABL

好的解决方案。必须添加依赖关系并学习其DSL。

JSON Builder

同一交易Rabl的:良好的解决方案。必须添加依赖关系并学习其DSL。

平原红宝石

Ruby是在生成JSON真棒,有什么新的学习,你可以调用一个哈希或AR对象to_json。只要注册为模板的扩展名为.rb(在初始化):

ActionView::Template.register_template_handler(:rb, :source.to_proc) 

然后创建视图的用户/ show.json.rb:

@user.to_json 

有关此方法的详细信息请参见http://railscasts.com/episodes/379-template-handlers

+7

请注意,在rails 4中,.ruby模板处理程序默认注册为https://github.com/rails/rails/commit/de1060f4e02925c12004f2,因此您可以跳过注册.rb并将文件用户命名为/ show.json.ruby。 – 2015-08-11 11:13:53

+1

此外,为了进一步更新,json_builder已被https://github.com/rails/jbuilder取代。 – 2015-08-11 11:15:25