2009-10-12 4 views
0

J'ai un problème en essayant de lier un stand avec deux cases à cocher qui sont résidents & communication, et ils semblent être stockés séparément si plus d'un stand est choisi. Si j'ai un support, les paramètres semblent être stockés de manière correcte dans un hachage d'un tableau, mais une fois que j'ajoute un autre support à ce même tableau, il semble permuter les hachages. Cette vue est comme ceci. Et vous avez une autre possibilité d'ajouter une autre position qui appelle la même partielle qui est:J'ai un problème en reliant un stand avec deux cases à cocher communication propriétaire et communication résidente

- 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 

J'attends un tableau qui contient un deux hash ou plus en fonction du nombre de stands que j'ai choisi . Si j'ai sélectionné un stand et les deux cases à cocher Je pense que le mensonge de hachage:

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

Et si j'ai deux j'attendre:

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

Mais maintenant, si je sélectionne deux stands je trouve:

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

Et il me donne des erreurs à l'intérieur de mon contrôleur quand je dois faire défiler les hachages pour sélectionner le stand_id.

Répondre

2

Le problème réside dans ce que vos check_box_tags ne définissent pas correctement où dans le hachage params ils devraient adapter.

Rails rend généralement facile d'obtenir toutes les droites d'emboîtement, sans que vous ayez recours à dur champ de codage ids. Malheureusement, ces méthodes pratiques échouent lorsque vous essayez d'utiliser un ensemble de cases à cocher. En raison du checkbox gotcha concernant les valeurs et les tableaux par défaut.

Votre utilisation de la case à cocher check_box_tag évite le gotcha, mais vous oblige à remplir les informations habituellement fournies par l'objet formulaire.

Il me semble que tous vos champs de plusieurs partiels sont ajoutés au même tableau de paramètres. La façon dont Rails gère les paramètres dupliqués dans un tableau est de démarrer un autre index. Ayez un bon aperçu de la source produite, à utiliser comme indices pour obtenir le résultat correct.

Le code que vous avez posté nécessitait trop d'efforts pour arriver à un point où je pouvais jouer avec. Donc je ne peux pas garantir que cela fonctionnera. Aussi, sans afficher le code du contrôleur, il n'y a aucun moyen de savoir pourquoi il génère des erreurs. Quelle que soit la solution, vous voulez ajouter un index aux paramètres pour chaque partie.

Vous voulez faire quelque chose comme ça. Où index est une valeur unique pour chaque partiel.

- 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 

Il produira hash params comme ceux-ci: Pour un stand avec les deux cases à cocher:

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

Pour deux stands avec les deux cases à cocher:

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

Vous pourriez vouloir regarder en accepte_nested_attributes_for et les champs imbriqués_pour l'utilisation. Ils simplifient ce genre de choses à la fois dans la vue et le contrôleur, mais tombent encore en proie à la case à cocher gotcha.