在 Rails 中,如何使用视图呈现 JSON?
Posted
技术标签:
【中文标题】在 Rails 中,如何使用视图呈现 JSON?【英文标题】:In Rails, how do you render JSON using a view? 【发布时间】:2011-01-06 11:50:36 【问题描述】:假设您在您的用户控制器中,并且您想获得一个显示请求的 json 响应,如果您可以在您的 views/users/ 目录中创建一个名为 show.json 的文件,并且在您的users#show 操作完成,它会渲染文件。
目前你需要做一些事情:
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 时那种可怕的肮脏感觉
【问题讨论】:
现在看这个帖子,看起来这不会为我节省多少,但我有更复杂的案例,当我说这让我头疼时相信我 在 Rails 3 中,您可以使用show.json.erb
文件调用 format.json
。看我的回答。
【参考方案1】:
我刚刚开始使用 RoR,如果不是您想要的,我深表歉意。我发现了这个,这可能是https://guides.rubyonrails.org/v5.1/layouts_and_rendering.html#using-render中描述的最新的直接方法
2.2.8 渲染 JSON
您不需要在要渲染的对象上调用 to_json。如果你使用 :json 选项,render 会自动为你调用 to_json。
您在操作中需要做的就是这个
respond_to do |format|
format.html
format.atom
format.json render json: @user
end
它会在 ./users/1/custom_action.json 中呈现您的 json 响应
【讨论】:
【参考方案2】:我是 RoR 的新手,这是我发现的。可以直接渲染成json格式
def YOUR_METHOD_HERE
users = User.all
render json: allUsers: users # ! rendering all users
END
【讨论】:
【参考方案3】:您应该能够在您的 respond_to
块中执行类似的操作:
respond_to do |format|
format.json
render :partial => "users/show.json"
end
这将在app/views/users/_show.json.erb
中呈现模板。
【讨论】:
这很好,但你很快就会发现 erb 是一种痛苦的生成 json 的方式。查看我的答案以了解一些替代方案。 有什么方法可以不使用部分吗?【参考方案4】:正如其他人所提到的,您需要一个 users/show.json 视图,但是对于模板语言有一些选项需要考虑...
ERB
开箱即用。非常适合 HTML,但您很快就会发现它对于 JSON 来说很糟糕。
RABL
很好的解决方案。必须添加一个依赖并学习它的 DSL。
JSON Builder
与 RABL 相同:很好的解决方案。必须添加一个依赖并学习它的 DSL。
纯红宝石
Ruby 在生成 JSON 方面非常出色,没有什么新东西需要学习,因为您可以在 Hash 或 AR 对象上调用 to_json
。只需为模板注册 .rb 扩展名(在初始化程序中):
ActionView::Template.register_template_handler(:rb, :source.to_proc)
然后创建视图 users/show.json.rb:
@user.to_json
有关此方法的更多信息,请参阅http://railscasts.com/episodes/379-template-handlers
【讨论】:
请注意,在 rails 4 中,.ruby 模板处理程序默认注册为 github.com/rails/rails/commit/de1060f4e02925c12004f2,因此您可以跳过注册 .rb 并将文件命名为 users/show.json.ruby。 另外,为了进一步更新,json_builder 已被github.com/rails/jbuilder 取代。【参考方案5】:尝试添加一个视图 users/show.json.erb
这应该在您请求 JSON 格式时呈现,并且您还可以获得由 erb 呈现的额外好处,因此您的文件可能看起来像这样
"first_name": "<%= @user.first_name.to_json %>",
"last_name": "<%= @user.last_name.to_json %>"
【讨论】:
您可能希望使用@user.first_name.to_json
而不是escape_javascript
。 JS 允许的内容与 严格 JSON 之间存在一些细微的差异。 (随着浏览器实现自己的 JSON 解析器,这些差异变得越来越重要。)
你应该把单引号改成双引号,因为 JSON(不像 JS)只接受双引号字符串。
这很好,但你很快就会发现 erb 是一种痛苦的生成 json 的方式。查看我的答案以了解一些替代方案。
我知道这是一个旧答案,但它是完全错误的。 to_json 将返回一个格式化的 json 字符串 "" ,因此生成的 json 将永远不会使用额外的引号 (""value"")。此外,如果用户名字为 nil,则生成的 json 将字符串“null”作为值。
我认为您还需要删除 <%= xyz.to_json %>
周围的引号,否则会留下多余的引号。【参考方案6】:
只是为了其他碰巧出现在此页面上的人而更新此答案。
在 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.5 年前回答了这个问题。现在我只在需要 JSON 时使用 respond_with,例如respond_with @user, only: [:name]
。请参阅此tutorial 了解更多信息。
只是为了补充这个答案,这实际上是危险的,原因有两个:它允许从用户数据注入,因为它不会转义换行符和反斜杠,并且
【参考方案7】:
如果您正在寻找 ERb 语法的更简洁的替代方案,RABL 可能是我见过的最好的解决方案。 json_builder 和 argonaut 是其他解决方案,它们似乎都有些过时,并且在没有一些补丁的情况下无法与 Rails 3.1 一起使用。
RABL 可通过 gem 获得或查看 GitHub 存储库;也是很好的例子
https://github.com/nesquena/rabl
【讨论】:
【参考方案8】:这可能是一个更好的选择并且比 ERB 更快:https://github.com/dewski/json_builder
【讨论】:
【参考方案9】:只需添加 show.json.erb
文件的内容
<%= @user.to_json %>
有时,当您需要一些控制器中不可用的额外帮助方法时,它很有用,即image_path(@user.avatar)
或在 JSON 中生成额外属性的东西:
<%= @user.attributes.merge(:avatar => image_path(@user.avatar)).to_json %>
【讨论】:
它必须是<%= raw(@user.to_json) %>
以避免 HTML 转义。我所做的是,只要 to_json 能给我我想要的东西,我就会依赖它,但是当我想做其他事情时,我会使用通常是 :blah => @user.the_blah .to_json
的模板来制作它。以上是关于在 Rails 中,如何使用视图呈现 JSON?的主要内容,如果未能解决你的问题,请参考以下文章