在 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”作为值。 我认为您还需要删除 &lt;%= xyz.to_json %&gt; 周围的引号,否则会留下多余的引号。【参考方案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 %>

【讨论】:

它必须是&lt;%= raw(@user.to_json) %&gt; 以避免 HTML 转义。我所做的是,只要 to_json 能给我我想要的东西,我就会依赖它,但是当我想做其他事情时,我会使用通常是 :blah =&gt; @user.the_blah .to_json 的模板来制作它。

以上是关于在 Rails 中,如何使用视图呈现 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 视图中呈现所有评论?

如何在 Rails 中控制器的一个操作中呈现不同的布局和 json 数据?

在视图中呈现现有类别,rails

如何在 Rails 视图中使用 AJAX

我应该如何在 Rails 中组织复杂的 SQL 视图?

在视图中呈现 JSON 数据 - 播放框架