Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 :有很多,:通过=>;表单中具有多个属性的关联表更新_Ruby On Rails 3_Associations_Has Many Through - Fatal编程技术网

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 %>