2010-03-25 86 views
0

我正在现有的Rails站点上进行维护工作,并遇到了一个奇怪的错误。这里涉及几种不同的模型:Registrations,Business CategoriesServicesRegistrations HABTM Business CategoriesServices,其中每个HABTM Registrations。每个HABTM关系都存在适当的非主键连接表。Rails:没有正确删除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 ... 

一般情况下,一切工作正常。用户可以注册尽可能多的或尽可能少的复选框,并且他们的注册商业类别和服务反映已选中的复选框。大多数情况下,后续的修改也是可行的。但是,如果用户在任何时候取消选择表单的给定部分(biz类别或服务)中的所有框,则表单的该部分的任何更改都不会被保存。没有任何错误消息,并且闪存“公司成功更新”仍然出现,但即使在提交表单之前未选中它们,这些框仍然会被检查。

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

感谢您的考虑!

贾斯汀

回答

0

如果没有选中复选框,然后在浏览器不发送任何东西的那场。 Rails通过包含一个与复选框同名的隐藏字段来解决这个问题。然后,Rails将单独取回隐藏字段(未选中框)或两个字段(已选中框)。问题是,这不适用于复选框字段的数组。我没有使用我的HAML,但我认为这是您的问题,并且如果没有选中复选框,params散列中没有:registration密钥,因此没有更新。

请参阅the API ref

+0

我想你已经死了。任何想法解决它? – justinbach 2010-03-25 18:06:46

+0

您可以测试以查看:注册密钥是否存在于散列中,如果不存在,请执行无复选框的操作。 – Fred 2010-03-25 19:56:37

+0

谢谢,弗雷德 - 这就是我所做的,它完美的工作! – justinbach 2010-03-26 18:35:40