我已经完成了这一千次,但我仍然对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\""
我错了吗?
答案 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
。
我认为文档应该澄清一下,但是你有它。虽然乍一看并不完全直观,但如果它以任何其他方式工作,我会感到惊讶。