在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仓库; 很好的例子
只是为了更新这个答案,为了碰巧遇到这个页面上的其他人。
在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