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

62lalag4  于 2023-01-25  发布在  Ruby
关注(0)|答案(9)|浏览(167)

假设你在用户控制器中,你想得到一个show请求的json响应,如果你能在你的views/users/ dir中创建一个名为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时所得到的那种可怕的肮脏感觉

k97glaaz

k97glaaz1#

你应该可以在你的respond_to代码块中做类似这样的事情:

respond_to do |format|
    format.json 
    render :partial => "users/show.json"
end

这将以app/views/users/_show.json.erb呈现模板。

zf2sa74q

zf2sa74q2#

尝试添加一个视图users/show.json.erb。当您请求JSON格式时,应该呈现该视图,并且您还可以获得由erb呈现的额外好处,因此您的文件可能如下所示

{
    "first_name": <%= @user.first_name.to_json %>,
    "last_name": <%= @user.last_name.to_json %>
}

(编辑于2023年1月23日,以修复值上的双引号)

k4emjkb1

k4emjkb13#

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

    • 再培训局**

开箱即用,非常适合HTML,但你很快就会发现它对JSON来说很糟糕。

    • 一个

很好的解决方案。必须添加一个依赖项并学习它的DSL。

    • 第一个e第一个f第一个x

与RABL的交易相同:很好的解决方案。必须添加一个依赖项并学习它的DSL。

    • 纯Ruby**

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

iibxawm4

iibxawm44#

如果您正在寻找ERb语法的更干净的替代方案,RABL可能是我见过的最好的解决方案。json_builder和argonaut是其他解决方案,它们似乎都有点过时,如果不打一些补丁,就不能与Rails3.1一起工作。
RABL可以通过gem或者GitHub仓库获得;也是很好的例子
https://github.com/nesquena/rabl

w41d8nur

w41d8nur5#

只是为了更新这个答案的其他人谁碰巧结束了在这个页面上。
在Rails3中,您只需要在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 %>"
}
6qfn3psc

6qfn3psc6#

只需添加show.json.erb文件及其内容

<%= @user.to_json %>

有时候,当你需要一些额外的helper方法,而这些方法在控制器中是不可用的,比如image_path(@user.avatar)或其他方法来在JSON中生成额外的属性时,它会很有用:

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

n53p2ov07#

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

p1iqtdky

p1iqtdky8#

我是RoR的新手,这是我发现的。你可以直接呈现一个JSON格式

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

5gfr0r5j9#

我刚刚开始使用RoR,如果它不是您要找的,我很抱歉。我找到了这个,这可能是www.example.com中描述的最新的简单方法https://guides.rubyonrails.org/v5.1/layouts_and_rendering.html#using-render
2.2.8渲染JSON
你不需要在你想要渲染的对象上调用_json,如果你使用:json选项,render会自动为你调用_json。
在你的行动中你需要做的就是

respond_to do |format| 
        format.html
        format.atom
        format.json { render json: @user }
end

它会在./users/1/custom_action.json中呈现json响应

相关问题