【问题标题】:Rails 3 Rebuild nested attributes from form dataRails 3 从表单数据重建嵌套属性
【发布时间】:2012-03-20 22:46:48
【问题描述】:

后端:我有一个模型(用户),它有很多另一个模型(ContactPreference)。 前端:允许用户重新排序、添加和删除特定用户的联系偏好的界面。

我想让用户通过一个表单提交一次性提交所有更改。我现在这样做的方式是在用户模型中使用allows_nested_attributes_for :contact_preferences,并天真地发布已编辑的首选项列表的属性。除了一个明显的错误外,它工作得很好:如果用户删除了联系首选项,则根本不会发送 ID,并且首选项不会从数据库中删除。

allows_nested_attributes_for 支持从集合中删除对象,但它需要客户端跟踪删除的 ID 并传递'_destroy' => 1 参数。这是我宁愿避免的混乱逻辑;我只想删除对象,除非它们明确包含在参数中。据我所知,allows_nested_attributes_for 不支持这种行为,所以我希望实现自己的解决方案。

进行这种更新的最有效(就数据库访问而言)方法是什么?我是否删除所有内容并从头开始重建列表?我是否加载关联并挑选出未明确包含的对象?也许我可以使用一些聪明的 ActiveRecord 魔法?

【问题讨论】:

    标签: ruby-on-rails-3 activerecord nested-attributes


    【解决方案1】:

    我个人的感觉是,使用:destroy => 1 标志设置比其他方法更不混乱。另一种方法是在服务器上加载关联,比较传入的参数,找出丢失的记录,然后删除丢失的记录并更新剩余的记录。这需要大量额外的逻辑、数据库操作,最糟糕的是,您将不得不手工修改 accepts_nested_attributes_for,这是一项不平凡的壮举。

    HTML 给你一个小技巧/hack 来完成这个没有 JS。为名称为:destroy 的每条记录添加一个复选框。使用高级表单助手,例如check_box,而不是 check_box_tag(这需要手动处理很多事情),或者更高级别的表单助手,例如 simple_form gem

    如果未选中该标志,则 HTML 不会提交任何内容,并且记录会保留。如果该标志被选中,HTML 将提交:destroy 标志,并使用内置的服务器端机制将其删除。

    你没有对你的前端代码说太多;听起来你那里有一堆 JS。当用户“删除”它时,您可能会隐藏记录,如果您不想使用上面的复选框方法,您可以在这种情况下以编程方式简单地添加 destroy 标志。这将比尝试事后猜测后端行为更简单,更不容易出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多