2010-12-07 4 views
0

Peut-être que je manque quelque chose d'évident (j'espère), mais je rencontre un problème étrange de sauver des enregistrements dans une forme imbriquée. C'est une configuration assez basique, avec une complication mineure en ce que mon modèle LineItem est une relation de deux mots (: line_items). Cependant, j'ai suivi les directives de Rails et cela semble fonctionner correctement. Mes montages créent les relations correctes entre les éléments de ligne et les factures, et tout s'affiche correctement dans mes vues, mais je ne peux pas obtenir d'enregistrements line_item pour les enregistrer correctement (dans ma console Rails ou mes vues).accepte_nested_attributes n'enregistre aucune modification

class Invoice < ActiveRecord::Base 
    attr_accessible :line_items #and the rest of my relevant attributes 
    has_many :line_items, :dependent => :destroy 
    accepts_nested_attributes_for :line_items, :allow_destroy => true 
    # Rest of my model code 
end 

class LineItem < ActiveRecord::Base 
    attr_accessible :invoice_id #and the rest of my relevant attributes 
    belongs_to :invoice 
end 

La méthode line_items_attributes= existe pour mes factures, mais il ne sauve pas de line_items pour de nouvelles factures. Plus irritant, je peux éditer les line_items existants ou les assigner après le fait, mais pas d'un seul coup (le point entier des attributs imbriqués?). Mes vues ne peuvent même pas modifier les éléments de ligne existants via le formulaire de facture. Des idées? Heureux de poster plus de code, mais n'a pas pour souci de brièveté.

Merci à l'avance ...

CODE VIEW (sur demande):

(forme partielle pour les factures)

<%= form_for(@invoice) do |f| %> 
    <% @invoice.line_items.build unless @invoice.line_items.any? %> 
    ... 
    <% f.fields_for :line_items do |builder| %> 
    <%= render 'line_item_fields', :f => builder %> 
    <% end %> 

(forme partielle des articles ligne)

... 
<%= f.collection_select :sku_id, @skus, :id, :name, :prompt => true %> 
<%= f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)") %> 

(javascript)

function remove_fields(link) { 
    $(link).previous("input[type=hidden]").value = "1"; 
    $(link).up(".fields").hide(); 
} 
+0

S'il vous plaît montrer votre vue code. Utilisez-vous 'fields_for'? – nathanvda

+0

Wow, je n'ai pas été en mesure de repérer quelque chose de mal avec le code que vous avez posté. Je penche pour penser que c'est un problème d'objet, rien à voir avec le contrôleur ou les couches de vue. Je n'ai pas le temps d'y plonger maintenant, j'espère que quelqu'un d'autre pourra intervenir. Avez-vous essayé de définir des attributs dans la console? Si cela échoue, vous avez un problème de modèle. S'il réussit, le problème est dans le contrôleur/vue. Bonne chance, et je reviendrai plus tard. –

+0

@Jaime: La console agit super bizarre. Je peux créer une facture et définir des attributs pour un nouveau 'line_item' ou plusieurs. Lorsque je sauvegarde réellement, les validations passent, mais aucun élément_ligne n'est créé (il me reste donc une facture vide et aucune notification indiquant que quelque chose s'est mal passé). Je ne peux pas manipuler ou détruire quoi que ce soit dans mes opinions. Je deviens fou ... – Nuby

Répondre

3

Le coupable probable ici est attr_accessible. Lorsque vous utilisez accept_nested_attributes_for, le nom de l'attribut pour une association est association_attributes. Donc, vous voulez

attr_accessible :line_items_attributes 

au lieu de

attr_accessible :line_items 
+0

Merci! Cela semblait faire l'affaire dans mes vues. Je ne sais pas si tout est réglé, mais je travaille jusqu'à présent. Je ne pensais pas que je devrais ajouter manuellement à la liste - j'ai supposé que nested_attributes s'en occuperait. – Nuby

0

Veuillez indiquer votre code d'affichage, car votre bug peut être lié à la façon dont vous appelez vos formulaires imbriqués. Voici mon primer sur les attributs imbriqués, si elle aide:

http://kconrails.com/2010/10/19/common-addresses-using-polymorphism-and-nested-attributes-in-rails/

Suivre ce guide peut prendre soin de votre problème.

+0

J'ai déjà vu ton blog, merci d'avoir jeté un oeil. Je vais vérifier votre code et voir si je peux comprendre où j'ai foiré ... – Nuby