Ruby on rails 在Rails中,如何使用视图呈现JSON?
假设您在用户控制器中,并且希望获得show请求的json响应,如果您可以在views/users/dir中创建一个名为show.json的文件,并且在用户的show操作完成后,它会呈现该文件,那就太好了 目前,您需要按照以下思路做一些事情:Ruby on rails 在Rails中,如何使用视图呈现JSON?,ruby-on-rails,ruby,json,templates,rendering,Ruby On Rails,Ruby,Json,Templates,Rendering,假设您在用户控制器中,并且希望获得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 => @u
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时所感受到的那种可怕的肮脏感觉您应该能够在
respond\u to
块中执行类似操作:
respond_to do |format|
format.json
render :partial => "users/show.json"
end
它将以
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 %>"
}
{
“名字”:“,
“姓氏”:”
}
只需添加包含内容的show.json.erb
文件即可
<%= @user.to_json %>
这可能是一个更好的选择,比ERB更快:如果您正在寻找一种更干净的替代ERB语法的方法,RABL可能是我见过的最好的解决方案。json_builder和argonaut是其他解决方案,它们似乎都有些过时,如果不进行一些修补,就无法与Rails 3.1一起使用 RABL可以通过gem或查看GitHub存储库获得;也有很好的例子
为了碰巧出现在本页上的其他人,我只想更新此答案 在Rails3中,您只需要在
views/users/show.json.erb
中创建一个文件。@user
对象将可用于视图(就像用于html一样)。您甚至不再需要来使用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*/
{
“名称”:”
}
正如其他人提到的,您需要一个用户/Suff.JSON视图,但是模板语言可以考虑选项…
ERB
开箱即用。非常适合HTML,但您很快就会发现它对JSON很糟糕
很好的解决方案。必须添加依赖项并学习其DSL
和RABL一样:好的解决方案。必须添加依赖项并学习其DSL
纯红宝石
Ruby在生成JSON方面非常出色,并且没有什么新东西需要学习,因为您可以在散列或AR对象上调用来生成JSON
。只需注册模板的.rb扩展名(在初始值设定项中):
然后创建视图users/show.json.rb:
@user.to_json
有关此方法的更多信息,请参见《我是RoR新手》这是我发现的。可以直接呈现json格式
def YOUR_METHOD_HERE
users = User.all
render json: {allUsers: users} # ! rendering all users
END
现在看这篇文章,看起来这不会给我节省太多,但我有更复杂的情况,相信我,当我说这会让我头痛在Rails 3中,你可以用show.json.erb
文件调用format.json
。查看我的答案。您可能希望使用@user.first\u name.to\u json
而不是escape\u javascript
。JS所允许的和严格意义上的JSON之间有一些细微的区别。(随着浏览器实现自己的JSON解析器,这些差异变得越来越重要。)您可能应该将单引号更改为双引号,因为JSON(与JS不同)只接受双引号字符串。这很好,但您很快就会发现erb是一种痛苦的JSON生成方法。看看我的答案,我知道这是一个古老的答案,但它是完全错误的。to_json将返回一个格式化的json字符串“”,因此生成的json将永远不会使用额外的引号(“value”)有效。此外,如果用户名为nil,则生成的json将以字符串“null”作为值。此外,我认为您还需要删除
周围的引号,否则会留下额外的引号。它需要是
,以避免HTML转义。我所做的是,只要json给了我想要的东西,我就依赖它,但当我想做其他事情时,我用通常是{:blah=>@user.the_blah}.to_json
的模板来做它。我在1.5年前回答了这个问题。现在,只要我需要JSON,我就使用respond_with,例如,respond_with@user,only:[:name]
。关于更多信息,请参考本文。除了这个答案之外,这实际上是危险的,原因有两个:它允许从用户数据中注入,因为它不会避开换行符和反斜杠,而且这很好,但您很快就会发现erb是一种痛苦的json生成方法。请查看我的答案,了解一些替代方法。有没有不使用部分的方法来完成此操作?请注意,在rails 4中,.ruby模板处理程序在默认情况下是注册的,因此您可以跳过注册.rb并将文件命名为users/show.json.ruby。
ActionView::Template.register_template_handler(:rb, :source.to_proc)
@user.to_json
def YOUR_METHOD_HERE
users = User.all
render json: {allUsers: users} # ! rendering all users
END