我正在构建一个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哈希?如果不是,那么有什么建议可以对传入的参数进行可靠的最佳转换?
这是我用来整理参数的当前代码,以防它有所帮助:
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
最佳答案
我的好友Omar将此 question on SO设置为ActiveSupport::JSON.decode(your_json)
,第二个答案就可以满足您的需求。