2017-01-20 5 views
0

Dans mon application Rails j'ai un modèle Kid et un modèle Allergy où un Kid has_many Allergies. J'ai également créé un formulaire imbriqué de sorte que les champs allergy sont dans le formulaire kid lors de la création d'un nouveau kid. Voilà ce que j'ai dans mon contrôleur kid:Rails enregistrer seulement l'enregistrement si les champs ne sont pas vides pour les formulaires imbriqués

def new 
    @kid = Kid.new 
    allergy = @kid.allergies.build 
end 

et c'est dans mon index.html.erb nichée dans ma création kid forme:

<%= f.fields_for :allergies, Allergy.new do |u| %> 
    <%= u.label :description, "Description", class: "control-label" %>  
    <%= u.text_field :description, class: "input-sm form-control" %> 
    <%= u.label :symptoms, "Symptoms", class: "control-label", %>  
    <%= u.text_field :symptoms, class: "input-sm form-control" %> 
<%end%> 

Cela fonctionne bien pour insérer un seul enregistrement allergy dans le modèle Allergy, mais je veux être en mesure d'énumérer jusqu'à 5 allergy entrées, et seulement insérer ceux que l'utilisateur remplit, comme kid pourrait avoir une quantité variable de allergies.

J'ai utilisé cet article: http://vicfriedman.github.io/blog/2015/07/18/create-multiple-objects-from-single-form-in-rails/

Cependant, je ne pouvais pas faire ce travail pour une forme imbriquée. Toute aide est appréciée, merci!

+0

Avez-vous essayé ': reject_if'? http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html –

Répondre

0

pour obtenir de multiples formes imbriquées pour vos relations, vous aurez besoin de construire le nombre d'éléments connexes que vous souhaitez afficher sous la forme, quelque chose comme:

def new 
    @kid = Kid.new 
    5.times do 
     @kid.allergies.build 
    end 
end 

à bloquer, puis enregistrer les relations vides dans la base de données , dans le modèle, vous pouvez utiliser quelque chose comme:

accepts_nested_attributes_for :allergies, reject_if: ->(allergy){ allergy['description'].blank? && allergy['symptoms'].blank? } 
+0

Cela fonctionne parfaitement, merci! –