在Rails中,如何使用视图呈现JSON?

Mat*_*hew 123 ruby templates json rendering ruby-on-rails

假设您在用户控制器中,并且想要获得show请求的json响应,那么如果您可以在views/users/dir中创建一个名为show.json的文件并且在您的用户#show之后创建一个文件会很好动作完成后,呈现文件.

目前你需要做一些事情:

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

但是如果你可以创建一个自动渲染的show.json文件就好了:

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

这样可以减轻我的痛苦,并且当我在控制器中渲染我的json时,它会消除我得到的那种可怕的肮脏感觉

Ale*_*ner 63

您应该可以在respond_to块中执行以下操作:

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end
Run Code Online (Sandbox Code Playgroud)

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

  • 这很好,但你很快就会发现erb是一种生成json的痛苦方法.有关其他选择,请查看我的答案. (5认同)

eri*_*rik 55

尝试添加视图users/show.json.erb这应该在您发出JSON格式请求时呈现,并且您还可以获得由erb呈现的额外好处,因此您的文件可能看起来像这样

{
    "first_name": "<%= @user.first_name.to_json %>",
    "last_name": "<%= @user.last_name.to_json %>"
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能希望使用`@user.first_name.to_json`而不是`escape_javascript`.JS允许的内容与*严格*JSON之间存在一些细微差别.(随着浏览器实现自己的JSON解析器,这些差异变得越来越重要.) (9认同)

tyb*_*103 31

正如其他人提到的那样,你需要一个users/show.json视图,但有一些选项需要考虑模板语言......

ERB

开箱即用.非常适合HTML,但你会很快发现它对JSON来说很糟糕.

Rabl的

好的解决方案 必须添加依赖项并学习其DSL.

JSON Builder

和RABL一样:好的解决方案.必须添加依赖项并学习其DSL.

纯Ruby

Ruby在生成JSON方面非常棒,因为你可以调用to_jsonHash或AR对象,所以没有什么新东西需要学习.只需注册模板的.rb扩展名(在初始化程序中):

ActionView::Template.register_template_handler(:rb, :source.to_proc)
Run Code Online (Sandbox Code Playgroud)

然后创建视图users/show.json.rb:

@user.to_json
Run Code Online (Sandbox Code Playgroud)

有关此方法的更多信息,请访问http://railscasts.com/episodes/379-template-handlers

  • 请注意,在rails 4中,默认情况下会注册.ruby模板处理程序https://github.com/rails/rails/commit/de1060f4e02925c12004f2,因此您可以跳过注册.rb并将文件命名为users/show.json.ruby. (7认同)

zap*_*nap 27

RABL可能是最好的解决方案,我已经看到你是否正在寻找一种更清晰的替代ERb语法.json_builder和argonaut,这些都是其他解决方案,看起来都有些过时,如果没有修补,它们将无法与Rails 3.1一起使用.

RABL可通过gem获取或查看GitHub存储库; 也是很好的例子

https://github.com/nesquena/rabl


Jam*_*Lim 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
Run Code Online (Sandbox Code Playgroud)

/* views/users/show.json.erb */
{
    "name" : "<%= @user.name %>"
}
Run Code Online (Sandbox Code Playgroud)

  • 我在 1.5 年前回答过这个问题。现在我只在需要 JSON 时使用 respond_with,例如 `respond_with @user, only: [:name]`。有关详细信息,请参阅此 [教程](http://bendyworks.com/geekville/tutorials/2012/6/respond-with-an-explanation)。 (2认同)
  • 只是为了补充这个答案,这实际上有两个原因是危险的:它允许从用户数据注入,因为它不会转义换行符和反斜杠,而且 &lt;%= html 也会转义数据,因此例如 Sean O'Connor 将有他的名字伤及肖恩·奥康纳。 (2认同)

Pri*_*iit 10

只需添加show.json.erb包含内容的文件即可

<%= @user.to_json %>
Run Code Online (Sandbox Code Playgroud)

有时,当您需要一些控制器中不可用的额外辅助方法时,image_path(@user.avatar)或者在JSON中生成其他属性时,它会很有用:

<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>
Run Code Online (Sandbox Code Playgroud)

  • 它需要是`<%= raw(@ user.to_json)%>`以避免HTML转义.我所做的就是我依靠to_json,只要它能给我我想要的东西,但是当我想做其他事情时,我会用通常的`{:blah => @ user.the_blah} .to_json`来模板化它. (7认同)

PET*_*OWN 6

这可能是一个更好的选择,比ERB更快:https://github.com/dewski/json_builder