Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Rails中,如何使用视图呈现JSON?_Ruby On Rails_Ruby_Json_Templates_Rendering - Fatal编程技术网

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

Ruby on rails 在Rails中,如何使用视图呈现JSON?,ruby-on-rails,ruby,json,templates,rendering,Ruby On Rails,Ruby,Json,Templates,Rendering,假设您在用户控制器中,并且希望获得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 => @u

假设您在用户控制器中,并且希望获得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时所感受到的那种可怕的肮脏感觉

您应该能够在
respond\u 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 %>

这可能是一个更好的选择,比ERB更快:

如果您正在寻找一种更干净的替代ERB语法的方法,RABL可能是我见过的最好的解决方案。json_builder和argonaut是其他解决方案,它们似乎都有些过时,如果不进行一些修补,就无法与Rails 3.1一起使用

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


为了碰巧出现在本页上的其他人,我只想更新此答案

在Rails3中,您只需要在
views/users/show.json.erb
中创建一个文件。
@user
对象将可用于视图(就像用于html一样)。您甚至不再需要
来使用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*/
{
“名称”:”
}

正如其他人提到的,您需要一个用户/Suff.JSON视图,但是模板语言可以考虑选项…

ERB

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

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

和RABL一样:好的解决方案。必须添加依赖项并学习其DSL

纯红宝石

Ruby在生成JSON方面非常出色,并且没有什么新东西需要学习,因为您可以在散列或AR对象上调用
来生成JSON
。只需注册模板的.rb扩展名(在初始值设定项中):

然后创建视图users/show.json.rb:

@user.to_json

有关此方法的更多信息,请参见《我是RoR新手》这是我发现的。可以直接呈现json格式

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

现在看这篇文章,看起来这不会给我节省太多,但我有更复杂的情况,相信我,当我说这会让我头痛在Rails 3中,你可以用
show.json.erb
文件调用
format.json
。查看我的答案。您可能希望使用
@user.first\u name.to\u json
而不是
escape\u javascript
。JS所允许的和严格意义上的JSON之间有一些细微的区别。(随着浏览器实现自己的JSON解析器,这些差异变得越来越重要。)您可能应该将单引号更改为双引号,因为JSON(与JS不同)只接受双引号字符串。这很好,但您很快就会发现erb是一种痛苦的JSON生成方法。看看我的答案,我知道这是一个古老的答案,但它是完全错误的。to_json将返回一个格式化的json字符串“”,因此生成的json将永远不会使用额外的引号(“value”)有效。此外,如果用户名为nil,则生成的json将以字符串“null”作为值。此外,我认为您还需要删除
周围的引号,否则会留下额外的引号。它需要是
,以避免HTML转义。我所做的是,只要json给了我想要的东西,我就依赖它,但当我想做其他事情时,我用通常是
{:blah=>@user.the_blah}.to_json
的模板来做它。我在1.5年前回答了这个问题。现在,只要我需要JSON,我就使用respond_with,例如,
respond_with@user,only:[:name]
。关于更多信息,请参考本文。除了这个答案之外,这实际上是危险的,原因有两个:它允许从用户数据中注入,因为它不会避开换行符和反斜杠,而且这很好,但您很快就会发现erb是一种痛苦的json生成方法。请查看我的答案,了解一些替代方法。有没有不使用部分的方法来完成此操作?请注意,在rails 4中,.ruby模板处理程序在默认情况下是注册的,因此您可以跳过注册.rb并将文件命名为users/show.json.ruby。
ActionView::Template.register_template_handler(:rb, :source.to_proc)
@user.to_json
def YOUR_METHOD_HERE
  users = User.all
  render json: {allUsers: users} # ! rendering all users
END