【问题标题】:Update nested attributes objects independently from parent model独立于父模型更新嵌套属性对象
【发布时间】:2021-05-29 10:34:30
【问题描述】:

我有一个父模型 'page'嵌套属性 模型 'page_modules',它们同时由 '单表继承' 模式建模。

我的问题是当我尝试保存不同生成的'page_modules' 时,如果其中一个未验证,则整个模型和嵌套属性都不会更新,即使其中一些嵌套属性通过了验证。 ¿ 有没有办法更新所有已验证的'page_modules',只拒绝未验证的'page_modules'

【问题讨论】:

  • 如果您尝试为所有父记录和嵌套记录添加记录并且某些内容无效,则所有内容都将回滚或不会提交。所以这里合适的选择是在迭代中一个一个地酸痛它们。并且仍然具有快速查询执行,您可以使用活动记录的事务方法。
  • UI 明智的一个更好的选择可能是使用 AJAX 为每个嵌套记录执行原子更新/创建查询。嵌套属性实际上是在经典应用程序中的一个表单提交中创建/更新多个资源的工具。

标签: ruby-on-rails validation nested-attributes single-table-inheritance sti


【解决方案1】:

如果我对您的理解正确,您希望在嵌套属性无效时静默删除它们并继续。您可以使用reject_if: option

class Page < ApplicationRecord
  has_many :page_modules
  accepts_nested_attributes_for :page_modules, reject_if: :page_module_invalid?

  private
  
  def page_module_invalid?(attributes)
    !page_modules.new(attributes).valid?
  end   
end

【讨论】:

  • 它不起作用。如果我尝试保存两个不同的page_modules,如果一个无效,另一个有效,当我提交时,在PageController中触发更新,如果有错误验证,它不会更新整个过程,并抛出错误。我认为page_modules 更新应该独立于page 进行迭代,但我不知道如何管理参数来做到这一点。
  • 正如我之前在评论中解释的那样 - 使用 ajax 来一一提交项目。虽然您可以在循环中拼凑一些东西,但如果您在事务之外创建项目,这将是一个更好的用户体验并且更容易处理所有可能发生的边缘情况。
  • 我正在考虑两种选择。按照您的建议使用 Ajax,或实施 jquery 验证,如果 page_moduledata 无效,则在视图中显示错误并禁用提交按钮。感谢您的帮助。谢谢@max @hiren-bhalani。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多