2010-08-08 4 views
2

J'essaie d'aplatir un tableau pour ma fiche.Rails: Aplanir un tableau dans le paramètre

def update 
    @tour = Tour.find(params[:id]) 
    params[:tour][:hotel_ids][0] = params[:tour][:hotel_ids][0].split(',') 
... 

Il en résulte:

"hotel_ids"=>[["1","2"]] 

Naturellement, je veux que ce soit

"hotel_ids"=>["1","2"] 

Ma Forme:

<%= text_field_tag 'tour[hotel_ids][]', nil %> 

quelqu'un Hope peut aider.

EDIT


J'ai eu à travailler, en quelque sorte. Cela pourrait être une mauvaise façon de le faire si:

J'ai changé les text_field qui obtiennent est le tableau de jquery à:

<%= text_field_tag 'tour[h_ids][]', nil %> 

puis dans mon contrôleur je l'ai fait:

params[:tour][:hotel_ids] = params[:tour][:h_ids][0].split(',') 

Et ce fonctionne, j'ai dû ajouter h_ids à attr_accessor cependant. Et ce sera probablement un gros WTF pour quiconque lira le codeur plus tard ... mais est-ce acceptable?

+0

Alors params [: tour] [: hotel_ids] = params [: tour] [: hotel_ids] [0] .split (',') ne fonctionnait pas? Parce que c'est EXACTEMENT ce que vous faites là, mais sans l'objet tampon. – Rock

+0

Non, ça n'a pas fonctionné ... – Amund

+0

Btw, ** grand ** merci à vous Rock et MBO de porter avec moi. C'est un énorme soulagement d'avoir au moins travailler après littéralement des jours d'essayer différentes choses. – Amund

Répondre

3

Ceci est du rubis!

params[:tour][:hotel_ids][0].flatten! 

devrait faire l'affaire!

ps: le '!' est important ici car il provoque l'enregistrement de l'aplatissement sur l'objet appelant.

pps: pour les questions relatives à rubis, je suggère fortement à expérimenter avec le irb ou script/console. Vous pouvez prendre votre objet et demander

object.inspect 
object.methods 
object.class 

Ceci est vraiment utile lors du débogage et de découvrir ce que Ruby peut faire pour vous.

+0

J'ai beaucoup expérimenté en IRB avant de poster, mais mon problème est de savoir comment le faire fonctionner dans les rails. Disons params [: tour] [: hotel_ids] [0] == ["1", "2", "3"], puis appeler aplatir cela ne fera rien. Ce que j'ai vraiment besoin d'appeler aplati est le paramètre hotel_ids. Espérons que cela clarifie. – Amund

+0

params [: tour] [: hotel_ids] .flatten! ne fonctionne pas alors? Ne pas oublier le '!' Que retournent les paramètres [: tour] [: hotel_ids] .class .inspect? Ou essayez une mémoire tampon: buf = params [: tour] [: hotel_ids] [0] # ou sans le [0] buf.flatten! Et vérifiez si c'est ce que vous voulez. – Rock

+0

attente. Qu'est-ce que params [: tour] [hotel_ids] [0] exactement? Avez-vous besoin d'appeler split (',') pour obtenir un tableau en premier lieu? Alors peut-être juste ajouter le .flatten (sans le '!') Aux paramètres [: tour] [: hotel_ids] [0] = params [: tour] [: hotel_ids] [0] .split (','). – Rock

0

Il suffit d'utiliser <%= text_field_tag 'tour[hotel_ids]', nil %> ici, puis diviser comme vous le faites dans l'exemple. Ce qui se passe vraiment dans votre exemple, c'est que Rails obtient param (-s) tour[hotel_ids][] en requête et il pense: "ok, donc params[:tour][:hotel_ids] est un tableau, donc je vais juste pousser toutes les valeurs avec ce nom comme valeurs suivantes à ce tableau ", et vous obtenez exactement ce comportement, vous avez un élément dans le tableau params[:tour][:hotel_ids], qui est votre valeur (" 1,2 ").Si vous n'avez pas besoin (ou ne veulent pas) pour affecter plusieurs valeurs à même de créer alors ne param pas un tableau (ne pas ajouter [] à la fin du nom)

Edit:

vous pouvez aussi aller moyen facile (si vous voulez seulement répondre à la question affichée, pas la solution au problème de la raison pour laquelle vous avez maintenant ce que vous attendez) et juste changer votre ligne contrôleur:

params[:tour][:hotel_ids] = params[:tour][:hotel_ids][0].split(',') 

#split retours tableau et dans Dans votre exemple, vous avez affecté ce nouveau tableau à la première position d'un autre tableau. C'est pourquoi vous avez eu array-in-array.

+0

C'était aussi mon idée initiale, mais le résultat est sorti "hotel_ids" => "1,2". Je veux que hotel_ids soit un tableau de plusieurs objets collectés à partir de params [: tour] [: hotel_ids] [] – Amund

+0

@Amund Si vous voulez plusieurs objets, alors vous avez besoin de plusieurs '' 'dans votre fichier html (ou entrez' multiple = true'), sinon vous devez créer plusieurs objets par vous-même, avec split (",") par exemple – MBO

+0

Devrais-je aussi avoir un champ caché avec <% = hidden_field_tag ​​'tour [hotel_ids]', nil%>? J'ai essayé avec simplement modifier le contrôleur mais le résultat était: "hotel_ids" => ["1,3"] encore inspecter sur params [: tour] [: hotel_ids] == ["1", "3"] Lorsque j'ai essayé avec un hidden_field j'ai Statut: 500 Erreur interne du serveur attendu Array (got String) pour param 'hotel_ids ' – Amund