0

我在尝试将一个支架与两个常驻和通信复选框链接时遇到问题,如果选择了多个支架,它们似乎是分开存储的。

如果我有一个支架,参数似乎以正确的方式存储在数组的散列中,但是一旦我将另一个支架添加到同一个数组中,它似乎会交换散列。我的视图是这样的。您还可以选择添加另一个调用相同部分的支架,即:

- unless @stands.empty?
%tr#show_stands.contentText
%td{:width => "27%", :valign => "top"}
  Select Stand For Ownership
%td{:width => "15%", :valign => "top"}
  = collection_select "owned_stands[]", "stand_id", @stands, :id, :erf_no_rr_no,  options ={:prompt =>"Please select stand..."}, {:class => 'dropdownSelect'}
   
   
%td{:valign => "top"}
  = check_box_tag "owned_stands[][owner_comm_list]"
  Add to Owners Communication list
  = check_box_tag "owned_stands[][resident_comm_list]"
  Add to Residents Communication list

我期待一个包含两个或更多散列的数组,具体取决于我选择的支架数量。如果我选择了一个立场和两个复选框,我希望散列谎言:

([{"stand_id" => "1", "resident_comm_list" => "1", "owner_comm_list" => "1"}])

如果我有两个,我期望:

([{"stand_id" => "1", "resident_comm_list" => "1", "owner_comm_list" =>    "1"},{"stand_id" => "2", "resident_comm_list" => "1", "owner_comm_list" => "1"}])

但现在如果我选择两个展位,我会发现:

 ([{"stand_id" => "1", "resident_comm_list" => "1"}, {"owner_comm_list" =>    "1"},{"stand_id" => "2"},{"resident_comm_list" => "1", "owner_comm_list" => "1"}])

当我必须遍历散列来选择stand_id时,它在我的控制器内部给了我错误。

4

1 回答 1

2

问题在于您的 check_box_tags 没有正确定义它们应该在 params 哈希中的位置。

Rails 通常可以让所有嵌套变得容易,而不需要您使用硬编码字段 ID。不幸的是,当您尝试使用一组复选框时,这些便捷方法会失败。因为复选框有关于默认值和数组的问题。

您使用 check_box_tag 避免了问题,但需要您填写通常由表单对象提供的信息。

在我看来,来自多个部分的所有字段都被添加到同一个参数数组中。Rails 处理数组中重复参数的方式是启动另一个索引。

仔细查看产生的源,用作获得正确结果的线索。

您发布的代码需要付出太多努力才能达到我可以玩弄它的地步。所以我不能保证这会奏效。同样,如果不发布控制器代码,就无法判断它为什么会抛出错误。

无论您想要为每个部分的参数添加索引的解决方案。

你想做这样的事情。其中 index 是每个部分的唯一值。

- unless @stands.empty?
%tr#show_stands.contentText
%td{:width => "27%", :valign => "top"}
  Select Stand For Ownership
%td{:width => "15%", :valign => "top"}
  = collection_select "owned_stands[#{index}][]", "stand_id", @stands, :id, :erf_no_rr_no,  options ={:prompt =>"Please select stand..."}, {:class => 'dropdownSelect'}
   
   
%td{:valign => "top"}  
  = check_box_tag "owned_stands[#{index}][owner_comm_list]"
  Add to Owners Communication list
  = check_box_tag "owned_stands[#{index}][resident_comm_list]"
  Add to Residents Communication list

它将产生像这样的参数哈希:对于一个带有两个复选框的立场:

params["owned_stands"] =
  {"0" =>  
    {"stand_id" => 1, "owner_comm_list" => 1, "resident_comm_list" => 1}
  }

对于带有两个复选框的两个支架:

prams[owned_stands] = 
 {
  "0" =>  
    {"stand_id" => 1, "owner_comm_list" => 1, "resident_comm_list" => 1}, 
  "1" => 
    {"stand_id" => 2, "owner_comm_list" => 1, "resident_comm_list" => 1}
 }

您可能想查看accepts_nested_attributes_for 和nested fields_for 的用法。他们在视图和控制器中都简化了这种事情,但仍然成为复选框陷阱的牺牲品。

于 2009-10-12T15:40:33.513 回答