渲染:json => 'string here'预期结果

时间:2011-07-29 20:25:30

标签: ruby-on-rails json

我已经完成了这一千次,但我仍然对render :json如何处理字符串感到不舒服。

要设置范围,我们来谈谈Rails 3

这就是它现在的表现:

...
render :json => 'This is the string'
...

将返回浏览器:

This is the string

这实际上不是有效的JSON响应:S

理想情况下,它应该呈现如下内容:

"This is the string"

即使是导轨指南也说:

  

您不需要在要渲染的对象上调用to_json。   如果使用:json选项,render将自动调用to_json   对你而言。

调用"This is the string".to_json实际上是按预期返回"\"This is the string\""

"This is the string".to_json #=> "\"This is the string\""

我错了吗?

1 个答案:

答案 0 :(得分:53)

我同意这首先是出乎意料的行为,但实际上它确实很有道理。

例如,考虑一下您期望这样做:

output = {'foo' => 'bar'}.to_json
render :json => output

即使to_json有点多余,您希望结果为{foo: "bar"}。但请注意,{'foo' => 'bar'}.to_json的结果实际上是一个字符串。因此,上面的代码块相当于:

render :json => '{foo: "bar"}'

如果render是传递给:json的JSON编码字符串,那么您将获得"{foo: \"bar\"}",这肯定是不是的预期行为。

所以这是交易:render检查:json参数是否是一个字符串。如果是这样,它假定它是一个JSON字符串,并且您已经运行to_json,并传递该字符串。如果没有,它会在对象上运行to_json

我认为文档应该澄清一下,但是你有它。虽然乍一看并不完全直观,但如果它以任何其他方式工作,我会感到惊讶。