У меня проблема в связывании стенда с двумя флажками общение владельца и общение жильца - PullRequest
0 голосов
/ 12 октября 2009

У меня проблема при попытке связать стенд с двумя флажками, которые являются резидентными и общительными, и они, кажется, хранятся отдельно, если выбрано более одного стенда.

Если у меня есть один стенд, кажется, что параметры правильно хранятся в хэше массива, но как только я добавляю другой стенд в этот же массив, он, похоже, меняет представление hashes.my на это. И у вас есть еще одна возможность добавить еще один стенд, который вызывает тот же частичный, который является:

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

1 Ответ

2 голосов
/ 12 октября 2009

Проблема заключается в том, что ваши check_box_tags неправильно определяют, где в хэше params они должны помещаться.

Rails, как правило, упрощает раскрой всех вложений, без необходимости прибегать к жестким идентификаторам полей кодирования. К сожалению, эти удобные методы не работают, когда вы пытаетесь использовать массив флажков. Из-за флажок получил относительно значений по умолчанию и массивов.

Использование check_box_tag позволяет избежать ошибок, но требует от вас заполнения информации, обычно предоставляемой объектом формы.

Мне кажется, что все ваши поля из нескольких частей добавляются в один и тот же массив параметров. Rails обрабатывает дублирующиеся параметры в массиве, чтобы запустить другой индекс.

Внимательно посмотрите на полученный источник, чтобы использовать его в качестве подсказки для получения правильного результата.

Код, который вы разместили, требовал слишком много усилий, чтобы добраться до точки, где я мог бы поиграть с ним. Поэтому я не могу гарантировать, что это сработает. Кроме того, без публикации кода контроллера невозможно определить причину возникновения ошибок.

Независимо от решения вы хотите добавить индекс к параметрам для каждого частичного.

Вы хотите сделать что-то подобное. Где индекс является уникальным значением для каждого частичного.

- 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 и вложенные поля_ для использования. Они упрощают подобные вещи как в представлении, так и в контроллере, но все же становятся добычей для флажка.

...