假设您在用户控制器中,并且想要获得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时,它会消除我得到的那种可怕的肮脏感觉
答案 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存储库;很好的例子
答案 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