【问题标题】:Rails: HABTM records not being deleted appropriatelyRails:HABTM 记录未正确删除
【发布时间】:2010-03-25 16:17:22
【问题描述】:

我正在对现有的 Rails 站点进行维护工作,但遇到了一个奇怪的错误。这里涉及几个不同的模型:RegistrationsBusiness CategoriesServicesRegistrations HABTM Business CategoriesServices,每个 HABTM Registrations。每个 HABTM 关系都存在适当的非主键连接表。

有一个包含两个部分(一个用于业务类别,一个用于服务)的表单,用户填写这些部分以更新他们的注册。这两个部分中的每一个都包含许多复选框,一个用于每个潜在的业务类别,一个用于每个服务。例如,生成业务类别复选框的 HAML 如下:

    - BusinessCategory.find(:all, :order => ['business_type']).each do |business_category|
      %li
        = check_box_tag "registration[business_category_ids][]", business_category.id, (@registration.business_categories.include?(business_category)) ? true : false
        = business_category.business_type

Registrations控制器的更新函数中:

  @registration = current_user.registration
  if @registration.update_attributes(params[:registration])
    flash[:notice] = "Company Successfully Updated."
    redirect_to :action => 'edit_company'
  else
    ... do appropriate error reporting and redirection ...

总的来说,一切正常。用户可以在注册时选中任意数量的复选框,并且他们的注册业务类别和服务会反映选中的复选框。在大多数情况下,后续修改也有效。但是,如果用户在任何时候取消选择表单的给定部分(商务类别或服务)中的所有框,则不会保存对表单该部分的任何更改。没有任何错误消息,并且“公司已成功更新”一闪而过,但这些框仍然处于选中状态,即使在提交表单之前它们未被选中。

如果我重建/重构网站,我更有可能使用has_many :through 而不是 HABTM,但我们的预算没有给我足够的时间。有没有人知道为什么 HABTM 似乎很难放手?

感谢您的考虑!

贾斯汀

【问题讨论】:

    标签: ruby-on-rails checkbox model has-and-belongs-to-many


    【解决方案1】:

    如果未选中复选框,则浏览器不会为该字段发回任何内容。 Rails 通过包含一个与复选框同名的隐藏字段来解决这个问题。然后,Rails 将单独返回隐藏字段(未选中框)或两个字段(选中框)。问题是这不适用于复选框字段数组。我不支持我的 HAML,但我认为这是您的问题,如果没有选中复选框,则 params 哈希中没有 :registration 键,因此不会更新任何内容。

    the API ref

    【讨论】:

    • 您可以测试一下 :registration 密钥是否存在于哈希中,如果不存在,则执行无复选框操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    相关资源
    最近更新 更多