在Rails中处理嵌套的JSON而不使用accepts_nested_attributes_for

时间:2012-10-29 17:36:41

标签: ruby-on-rails ruby-on-rails-3 json backbone.js

我正在构建一个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

1 个答案:

答案 0 :(得分:0)

有了这个 question on SO我的好友Omar说使用ActiveSupport::JSON.decode(your_json),第二个答案会起作用,以达到你所需要的。