我正在构建一个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),第二个答案就可以满足您的需求。

09-11 19:55
查看更多