我正在构建一个Rails应用程序,为Backbone.js前端提供JSON API。
我们在很多情况下提供类似于label: { id: 1, name: "My Label" }
的数据。当在表单中的选择框中使用它(指定关联)时,我们当前需要在发布的数据中指定label_id: 1
。我们希望API更加对称,并尽可能支持嵌套的label: { id: 1 }
表单。
到目前为止,我(毫不奇怪)得到ActiveRecord::AssociationTypeMismatch
错误,因为Rails期待Label
个对象,而是收到ActiveSupport::HashWithIndifferentAccess
。我知道如果我们想支持标签的嵌套修改,我们可以使用accepts_nested_attributes_for
,但在这种情况下,我只想使用嵌套表单为关联指定正确的标签。
在Rails(3.2.8)中是否有一种很好的方法可以在将params散列传递给模型之前修改它?如果没有,有什么建议可以在它们进来时强有力地改变参数吗?
这是我使用的当前代码,以便在有帮助的情况下展平params:
def flatten_params(hash)
hash.reduce({}) do |memo, (key, value)|
if value.class == ActiveSupport::HashWithIndifferentAccess
memo[(key.to_s + '_id').to_sym] = value['id']
else
memo[key] = value
end
memo
end
end
答案 0 :(得分:0)
有了这个 question on SO我的好友Omar说使用ActiveSupport::JSON.decode(your_json)
,第二个答案会起作用,以达到你所需要的。