我在我的Rails 3.2应用程序中遇到问题,其中通过JSON重新发送的虚拟属性不在params散列中的正确位置.嗯,这不是我所期待的.我的期望是否正确还有待观察.:)
我有一个使用标准虚拟属性模式的模型,如下所示:
class Track < ActiveRecord::Base
def rating
# get logic removed for brevity
end
def rating=(value)
# set logic
end
def as_json(options={}) # so my method is in the JSON when I use respond_with/to_json
super(options.merge(methods: [:rating]))
end
end
Run Code Online (Sandbox Code Playgroud)
发送到我的控制器的JSON如下所示:
{"id":1,"name":"Icarus - Main Theme 2","rating":2}
Run Code Online (Sandbox Code Playgroud)
要清楚,名称和ID不是虚拟的,评级是.
在rails实现其魔力之后,我最终在params哈希中得到了这个:
{"id"=>"1", "name"=>"Icarus - Main Theme 2", "rating"=>2, "track"=>{"id"=>"1", "name"=>"Icarus - Main Theme 2"}}
Run Code Online (Sandbox Code Playgroud)
如您所见,id和name使其成为嵌套的:track散列,但是rating不是.这是预期的行为吗?它打破了(在某种程度上)在控制器中使用嵌套哈希的标准做法,因为嵌套哈希不包含我需要的所有参数.
Track.update(params[:id], params[:track]) # :track is missing rating
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!