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

假设你在你的用户控制器中,你想得到一个针对 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 => @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 时产生的可怕的肮脏感觉

160277 次浏览

您应该能够在 respond_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 %>

当您需要一些在控制器中不可用的额外的助手方法时,比如 image_path(@user.avatar)或者在 JSON 中生成附加属性的其他方法时,它有时是很有用的:

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

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

如果您正在寻找 ERb 语法的更干净的替代方案,那么 RABL 可能是我见过的最好的解决方案。Json _ builder 和 argonomer 是其他的解决方案,它们看起来都有点过时,如果不进行一些修补,就不能在 Rails3.1中工作。

RABL 可以通过 gem 或 GitHub 存储库获得; 也有很好的示例

Https://github.com/nesquena/rabl

只是为了那些碰巧出现在这个页面上的人更新一下这个答案。

在 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 %>"
}

正如其他人提到的那样,您需要一个 users/show.json 视图,但是模板语言可以考虑一些选项..。

再培训局

开箱即用。非常适合 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

进出口新的 RoR 这是我发现。你可以直接呈现一个 json 格式

def YOUR_METHOD_HERE
users = User.all
render json: {allUsers: users} # ! rendering all users
END

我刚开始和 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 响应