我正在构建一个 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) 中是否有一种不涉及在将参数散列传递给模型之前修改参数散列的好方法?如果没有,有什么建议可以在参数传入时对其进行稳健转换的最佳方法?
这是我用来展平参数的当前代码,以防有帮助:
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