Question

J'ai plusieurs à plusieurs avec une boîte de lien, et je veux tirer ces modèles en une seule forme pour que je puisse mettre à jour à partir de la même page. Je suis vraiment du mal à obtenir le check_box pour montrer même tous les éléments de mon tableau - je l'ai parcouru le net et travaille sur ce littéralement toute la journée, et je trouve qu'il est difficile d'appliquer les informations que je lis à mon problème. Je suis aussi très nouveau pour RoR et j'ai suivi un peu d'un tutoriel vidéo obsolète (pré 2.0) donc mes excuses pour mon code. Jusqu'à présent, je l'ai à la sortie une seule paire de clés dans le tableau (le dernier un) - bien en dehors de la forme, le code utilisé dans le tutoriel fonctionne exactement comment il se doit. Cest de peu d'utilité si! L'hôte est le modèle pour lequel la principale forme est pour, et la facturation est le modèle extérieur que je suis en train d'ajouter au formulaire.

Ceci est le code qui fonctionne en dehors de la forme du tutoriel:

<% for billing in @billings -%>
<%= check_box_tag('billing_title[]', billing.id, @host.billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end -%>

J'ai juste besoin de savoir comment le faire fonctionner à l'intérieur de la forme. Voici le code mentionné ci-dessus qui ne récupère que la dernière paire de clés de tableau après une boucle à travers les:

<% f.fields_for :billings do |obj| %><br />
<%= check_box_tag('billing_title[]', billing.id, @billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end %>

Le débogage (@billings):

--- 
- !ruby/object:Billing 
attributes: 
title: Every Month
id: "1"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 12 Months
id: "2"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 6 Months
id: "5"
attributes_cache: {}

Toute aide vraiment apprécié.

Était-ce utile?

La solution

Craig, cela ressemble à ce que vous recherchez est accepts_nested_attributes_for qui est une bien meilleure façon de gérer les modèles imbriqués dans un formulaire.

Plutôt que de voler tout le travail de Ryan et republier ici, je vais vous donner un lien vers son screencast:

http://railscasts.com/episodes/196-nested -modèle-form-partie-1

est basé sur sa série de formes complexes.

Vous devriez être en mesure de taylor ce tutoriel à ce que vous essayez de faire, mais sinon je serais heureux de vous aider.

EDIT:

Bon, après avoir regardé votre code, il y a quelques choses que vous causer des problèmes. :)

D'abord, avec les associations, vous n'avez pas besoin de tirer une collection supplémentaire pour les facturations, i.e.:.

@host = Host.find(params[:id])
@voips = Voip.find(:all)
@custsupps = Custsupp.find(:all)
@payments = Payment.find(:all)
@billings = Billing.find(:all) # <-- This is not needed and causing your problems

La configuration de l'association dans le modèle fait tout cela pour vous. Cela fait partie de la magie des rails. : D

Maintenant, il est important de noter que lors de l'utilisation des associations vous devez vous assurer que les objets sont effectivement associés. En d'autres termes, si vous avez 3 objets Billings dans votre base de données et ne sont pas associés à votre objet hôte, ils ne seront pas visibles sous la forme.

Si vous essayez d'associer une facturation à un hôte en utilisant une case à cocher vous allez vouloir prendre une approche différente, parce que votre forme avec affichage uniquement Billings déjà associés avec votre hôte.

Si votre juste essayer de modifier ou de modifier Billings existants qui sont associés à l'hôte, où la case représente un attribut « payé » (un booléen), par exemple, cette approche est très bien et votre code de forme ressemblerait à quelque chose comme ça :

<% f.fields_for :billings do |b| %><br />
  <%= b.check_box :paid %> <%= b.title %>
<% end %>

Alors, peut-être préciser ce que vous essayez d'accomplir à partir d'un point de vue de la fonctionnalité et nous pouvons trouver une meilleure solution.

Autres conseils

Je ne suis pas sûr de ma réponse, mais je vais essayer ...

<% f.fields_for :billings, @billings do |obj| %>
   # ...
<% end %>

On dirait à moi comme c'est un problème avec les boucles for ...

Dans votre exemple de code, vous Boucler dans la @billings (un tableau d'objets de facturations passées de votre contrôleur), et d'appeler l'actuel billing.

Dans votre code de formulaire, vous Boucler dans le :billings (symbole faisant référence aux facturations ActiveRecords) et appeler l'actuel obj. Ensuite, prêter à confusion, votre code de re-utilise le nom de la variable obj à nouveau dans la fonction @ de billings.collect ... mais cela devrait avoir une portée locale privée et non l'effet de votre boucle principale, mais il est difficile d'interpréter à vue.

Quoi qu'il en soit, étant donné que la substance à l'intérieur de votre boucle de forme ne fait pas référence obj, il utilise la variable billing - qui ne change pas quand on boucle, mais conserve la dernière valeur qu'il avait: le dernier élément de la boucle précédente ! Cela explique pourquoi vous ne voyez que la dernière balise. (En outre, la fonction debug(@billings) fait sa propre boucle à travers les enregistrements de toutes sortes -. Il est pas dans la boucle fields_for faire)

Je voudrais commencer par changer la première ligne de votre code de formulaire pour réutiliser à nouveau le nom de la variable billing, comme ceci:

<% f.fields_for :billings do |billing| %><br />

la syntaxe du bloc de Ruby peut être assez déroutant au premier abord - ou, diable, quand vous « re lecture de code que vous ne vous êtes pas écrire - mais quand vous cassez tout bas aux composants de base, il est généralement en boucle juste par un ensemble d'éléments et d'effectuer une fonction sur chacun d'eux. Soyez également vigilant pour la confusion entre les noms ressemblants: @billing, @billings,: facturations et facturations sont toutes différentes choses à Ruby et Rails. Bonne chance!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top