Ruby on rails 3 :有很多,:通过=>;表单中具有多个属性的关联表更新
我有一个最困难的时间得到这个正确的渲染和更新。现在的情况是,我有一个多对多关联,关联联接表包含多个属性。一个案例可以有多个屏幕,一个案例可以有多个屏幕,一个案例的屏幕可以针对每个案例进行排序。我当前设置中出现的另一个奇怪的问题是,每次提交表单时,关联表都没有清除旧的关联值。新值将被追加到表中 课程:Ruby on rails 3 :有很多,:通过=>;表单中具有多个属性的关联表更新,ruby-on-rails-3,associations,has-many-through,Ruby On Rails 3,Associations,Has Many Through,我有一个最困难的时间得到这个正确的渲染和更新。现在的情况是,我有一个多对多关联,关联联接表包含多个属性。一个案例可以有多个屏幕,一个案例可以有多个屏幕,一个案例的屏幕可以针对每个案例进行排序。我当前设置中出现的另一个奇怪的问题是,每次提交表单时,关联表都没有清除旧的关联值。新值将被追加到表中 课程: class Case < ActiveRecord::Base attr_accessible :cases_screens_attributes has_many :cas
class Case < ActiveRecord::Base
attr_accessible :cases_screens_attributes
has_many :cases_screens
has_many :screens, :through => :cases_screens
accepts_nested_attributes_for :cases_screens,
:allow_destroy => true,
:reject_if => lambda { |p| p[:screen_id].nil? }
end
class Screen < ActiveRecord::Base
has_many :cases_screens
has_many :cases, :through => :cases_screens
end
class CasesScreen < ActiveRecord::Base
attr_accessible :order
belongs_to :case
belongs_to :screen
end
我曾多次尝试使用fields_,但均无效。这是我目前在_form.erb.html文件中的内容。最终的目标是,在案例表单上看到所有屏幕的列表,每个屏幕旁边都有一个复选框。每个复选框还具有“订单”的关联输入。提交后,案例屏幕表将正确填充(如果不再选择旧值,则删除旧值)
在这件事上,我已经把头撞在墙上好几天了,但我似乎不能把它做好。任何帮助都将不胜感激
补充说明:
我使用简单表单,我只做了以下操作:
<%= f.association :screens %>
并且一切都按预期工作(sans order属性更新)。关联表已正确清理。当然,这是在指出嵌套属性是罪魁祸首,但我不确定
更新星期三10:45
我现在确信,这里发生的问题是缺少以表格形式呈现的案例。通常在清理过程中,rails将使用此ID清理以前的条目,然后填充新条目。由于我在@screens上循环,而不是在当前的cases\u屏幕(与案例相关联)上循环,因此如果不在每一行上进行查询,我无法获取id
我想现在,我的解决方案是将一个before_save方法写入cases_屏幕,该方法将清除cases_屏幕的当前条目,然后允许填充新值
更新1:15
我至少对其中一个项目做了一点修改,这样只有选中复选框时才会插入记录。我已将更新的:reject_if添加到上面的案例类中。对于为什么只将值附加到表中,以及为什么不删除以前的值,我仍然没有解决方案
更新时间:4:00
我最新的尝试包括一个隐藏字段,其中包含仅在设置记录时才显示的案例ID。这需要我在循环中进行子查询以获取当前案例屏幕id。与:reject\u if参数一起,值现在被正确更新。但是,无法再删除当前设置的值
我不可能做对这件事,这感觉不像rails。这个场景是不是我应该在控制器中手动处理数据的场景之一?此时,我把这归结为一个设计问题 我现在正在使用
<% @case.cases_screens.each do |cs| %>
<%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][id]", cs.id) %>
<%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][screen_id]", cs.screen_id) %>
<%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][_destroy]", 1) %>
<label><%= check_box_tag("case[cases_screens_attributes][#{cs.id}][_destroy]", 0, @case.cases_screen_ids.include?(cs.id)) %> <%= cs.screen.name %></label>
<%= text_field_tag("case[cases_screens_attributes][#{cs.id}][ordinality]", cs.ordinality) %>
<% end %>
这将导致仅显示当前设置的案例/屏幕链接。用户需要通过单独的屏幕将特定屏幕添加到案例中 呃。。。当您将
cases\u screen
与has\u many
一起使用时,它不应该是复数吗?像有很多:案例屏幕
?我现在更新了代码以反映我的模型(包括多元化)。它仍在以同样的方式运行。
<%= f.association :screens %>
<% @case.cases_screens.each do |cs| %>
<%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][id]", cs.id) %>
<%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][screen_id]", cs.screen_id) %>
<%= hidden_field_tag("case[cases_screens_attributes][#{cs.id}][_destroy]", 1) %>
<label><%= check_box_tag("case[cases_screens_attributes][#{cs.id}][_destroy]", 0, @case.cases_screen_ids.include?(cs.id)) %> <%= cs.screen.name %></label>
<%= text_field_tag("case[cases_screens_attributes][#{cs.id}][ordinality]", cs.ordinality) %>
<% end %>