2017-09-11 1 views
1

Cela semblait assez simple, mais s'avère ne pas être.Créer plusieurs enregistrements à la fois ruby ​​sur rails

J'ai deux modèles: Auteurs et Livres. Les auteurs ont de nombreux livres, les livres appartiennent aux auteurs. J'aimerais pouvoir ajouter plusieurs livres dans un seul formulaire avec différents auteurs et des informations pour chacun.

class BooksController < ApplicationController 

def new 
@books = [] 
    5.times do 
    @books << Book.new 
    end 
end 

Je ne suis pas sûr que ce soit la bonne façon de former le contrôleur. La vue est le suivant:

<%= form_tag(books_path(@books)) %> 
<% @books.each do |book| %> 
    <%= text_field_tag(:title) %> 
    <%= text_field_tag(:author) %> 
    <%= text_field_tag(:pages) %> 
<% end %> 
<%= submit_tag("Submit") %> 

C'est aussi loin que je suis devenu, comme je ne peux pas les @books pour finir dans mes params, donc je ne l'ai pas eu à essayer la méthode create encore . Tout ce que je reçois est le: titre,: auteur et: pages du dernier enregistrement, et ils ne sont même pas dans un livre param.

+0

Vous recherchez l'assistant 'fields_for'. – meagar

Répondre

2

form_tag ne connaît pas votre objet modèle. Donc, il ne sera pas envelopper vos paramètres sous la clé appropriée. Vous devriez plutôt utiliser form_for pour vous épargner la peine de construire les params.

Pour créer des objets associés, vous pouvez utiliser accepts_nested_attributes_for.

Afin de créer plusieurs objets, vous devez send their params to your controller in an array. Mais je vous suggère de sauvegarder un seul enregistrement. Vous codez serait plus propre et vous pouvez profiter des assistants de forme Rails tels que form_for et fields_for au lieu de construire le code HTML à la main.

+0

Quelle serait la bonne façon de construire avec 'form_for'? La variable locale @books est un tableau, donc je ne sais pas comment cela fonctionne avec cette méthode –

+1

Si vous voulez coller avec @books et créer plusieurs enregistrements sous une forme, vous serez probablement bloqué avec form_tag et la construction HTML manuellement , comme la solution liée. Mais je pense qu'il est préférable de créer un enregistrement sous une forme. Le code est plus propre et l'expérience utilisateur est probablement meilleure. Vous pouvez toujours utiliser ajax si vous voulez permettre aux utilisateurs de continuer à créer des enregistrements sans être redirigés. – EJ2015

+0

Oui, l'objectif était de créer plusieurs enregistrements avec un formulaire pour le rendre plus rapide. L'application dispose déjà d'un formulaire pour en ajouter un, mais souhaitait explorer l'ajout d'un formulaire permettant une importation en bloc. –