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

时间:2010-01-18 18:31:25

标签: ruby-on-rails ruby json templates rendering

假设您在用户控制器中,并且想要获得show请求的json响应,那么如果您可以在views / users / dir中创建一个名为show.json的文件,并且在您的用户#show action完成后,呈现文件。

目前你需要做一些事情:

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时,它会消除我得到的那种可怕的肮脏感觉

8 个答案:

答案 0 :(得分:63)

您应该可以在respond_to区块中执行以下操作:

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

将在app/views/users/_show.json.erb中呈现模板。

答案 1 :(得分:55)

尝试添加一个视图users/show.json.erb当你提出JSON格式的请求时,应该呈现这个,并且你也可以通过erb呈现它的额外好处,所以你的文件可能看起来像这样

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

答案 2 :(得分:31)

正如其他人所说,你需要一个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

答案 3 :(得分:27)

RABL可能是最好的解决方案,我已经看过你是否正在寻找一种更清晰的替代ERb语法。 json_builder和argonaut,这些都是其他解决方案,看起来都有些过时,如果没有修补,它们将无法与Rails 3.1一起使用。

RABL可通过gem获取或查看GitHub存储库;很好的例子

https://github.com/nesquena/rabl

答案 4 :(得分:21)

只是为了碰巧在本页面上遇到其他人而更新此答案。

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

答案 5 :(得分:10)

只需添加包含内容的show.json.erb文件

即可
<%= @user.to_json %>

有时候当你需要一些在控制器中不可用的额外辅助方法时很有用,例如image_path(@user.avatar)或者用JSON生成其他属性的东西:

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

答案 6 :(得分:6)

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

答案 7 :(得分:0)

我是RoR的新手,这是我发现的。您可以直接呈现json格式

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