我正在现有的rails网站上进行维护工作,并遇到了一个奇怪的错误。此处涉及一些不同的模型:Registrations
,Business Categories
和Services
。 Registrations
HABTM Business Categories
和Services
,其中每个都是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似乎无法放手?
感谢您的考虑!
贾斯汀
答案 0 :(得分:0)
如果未选中复选框,则浏览器不会为该字段发回任何内容。 Rails通过包含一个与复选框同名的隐藏字段来解决这个问题。然后Rails将单独返回隐藏字段(未选中框)或两个字段(选中框)。问题是这不适用于复选框字段数组。我不喜欢我的HAML,但我认为这是你的问题,如果没有勾选复选框,:registration
哈希中没有params
键,所以没有更新。< / p>
请参阅the API ref。