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

假设你在你的用户控制器中,你想得到一个JSON响应的显示请求,这将是很好,如果你可以在你的views / users /目录中创build一个文件,命名为show.json和你的用户#显示动作完成后,呈现文件。

目前你需要做一些事情:

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

但是如果你可以创build一个show.json文件,它会自动呈现像这样:

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

这会为我节省很多的痛苦,并且会冲走当我在控制器中渲染我的json时得到的可怕的肮脏的感觉

你应该可以在你的respond_to块中做这样的事情:

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

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

尝试添加一个视图users/show.json.erb当你提出JSON格式的请求时,这应该被渲染,并且你也得到了由erb渲染的好处,所以你的文件可能看起来像这样

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

正如其他人所说的,你需要一个users / show.json视图,但是对于模板语言还有一些选项需要考虑。

ERB

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

Rabl的

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

JSON生成器

和RABL一样的好处:很好的解决scheme。 必须添加依赖关系并学习其DSL。

平原ruby

Ruby在生成JSON方面to_json ,并且没有什么新东西可以学习,因为您可以在Hash或AR对象上调用to_json 。 只需注册模板的.rb扩展名(在初始化程序中):

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

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

 @user.to_json 

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

RABL可能是我所见过的最好的解决scheme,如果你正在寻找更清晰的替代ERb语法。 json_builder和argonaut,这些都是其他的解决scheme,都显得有点过时了,如果没有补丁,Rails 3.1将无法工作。

RABL可以通过gem获得,或者查看GitHub仓库; 很好的例子

https://github.com/nesquena/rabl

只是为了更新这个答案,为了碰巧遇到这个页面上的其他人。

在Rails 3中,您只需要在views/users/show.json.erb创build一个文件。 @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 %>" } 

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

 <%= @user.to_json %> 

有时候,当你需要一些控制器中没有的辅助方法,比如image_path(@user.avatar)或者用JSON生成其他属性的时候,

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

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