0

J'essaie de fournir un moyen de générer un nouvel objet ("List") dans un modèle avec un nouvel objet associé dans un autre ("Item") en utilisant une relation has_many through (à travers "Groupements"). J'ai réussi à faire fonctionner correctement le formulaire mais je n'arrive pas à comprendre ce qui me manque pour terminer correctement le processus de création.Rails Attributs imbriqués avec has_many par association ne créant pas

Rails v. 5.1.2, Ruby v. 2.4.1

lists_controller.rb

def new 
    @list = current_user.lists.new 
    3.times { @list.items.build } 
    end 

    def create 
    @list = current_user.lists.new(list_params) 
    respond_to do |format| 
    if @list.save 
    format.html { redirect_to @list, notice: 'List was successfully created.' } 
    format.json { render :show, status: :created, location: @list } 
    else 
    format.html { render :new } 
    format.json { render json: @list.errors, status: :unprocessable_entity } 
    end 
    end 
    end 

    private 
    def set_list 
    @list = List.find(params[:id]) 
    end 

def correct_user 
    @list = current_user.lists.find_by(id: params[:id]) 
    redirect_to lists_path, notice: "Not authorized to edit this list" 
if @list.nil? 
end 


def list_params 
    params.require(:list).permit(:title, { 
    item_attributes: [ 
      :id, :title, :url 
      ]}) 
end 

items_controller.rb

 def new 
     @item = Item.new 
    end 

    private 

    def set_item 
     @item = Item.find(params[:id]) 
    end 


    def item_params 
     params.require(:item).permit(:title, :body, :url, :created, 
    :list_ids => []) 
     end 
    end 

modèle list.rb

has_many :groupings, :dependent => :destroy 
has_many :items, :through => :groupings 

accepts_nested_attributes_for :items, 

reject_if: ->(attrs) { attrs['title'].blank? || attrs['url'].blank? } 

modèle item.rb

has_many :groupings, :dependent => :destroy 
has_many :lists, :through => :groupings 
validate :has_lists? 
    accepts_nested_attributes_for :lists 

attr_writer :list_titles 
after_save :assign_lists 

    def list_titles 
    @list_titles || lists.map(&:title).join(' ') 
    end 
    private 

    def assign_lists 
    if @list_titles 
    self.lists = @list_titles.split(/\,/).map do |title| 
    if title[0..0]==" " 
     title=title.strip 
    end 
    title=title.downcase 
    List.find_or_create_by_title(title) 
    end 
    end 
end 

    def has_lists? 
    errors.add(:base, 'This item needs to be assigned to a list before it can be saved.') if self.lists.blank? 
    end 

modèle grouping.rb

belongs_to :item 
belongs_to :list 

accepts_nested_attributes_for :item, :list 

listes Formulaire

<%= form_with(model: list, local: true) do |f| %> 
<% if list.errors.any? %> 
<div id="error_explanation"> 
    <h2><%= pluralize(list.errors.count, "error") %> prohibited this list from being saved:</h2> 

    <ul> 
    <% list.errors.full_messages.each do |message| %> 
    <li><%= message %></li> 
    <% end %> 
    </ul> 
</div> 
<% end %> 

<div class="field"> 
<%= f.label :title %> 
<%= f.text_field :title, id: :list_title %> 
</div> 

<div> 
<p><strong>Items:</strong></p> 

<%= f.fields_for :items do |item| %> 
    <div> 
    <%= item.label :title %> 
    <%= item.text_field :title %> 

    <%= item.label :url %> 
    <%= item.text_field :url %> 
    </div> 
<% end %> 
</div> 




<div class="actions"> 
<%= f.submit %> 
</div> 
<% end %> 

Console Exemple de sortie

POST Started "/ listes" pour 127.0.0.1 à 19/09/2017 13:12:53 -0700 Traitement par ListsController # créer en HTML Paramètres: { "UTF8" => "✓", "authenticity_token" => "Y6rszWVUXDIVymuoBkXwvkw1pVbyC6mffiWIZzr7PVd1NT9JJi6rD72k5Fh2qU5Q5tEd0qn6bFYMSJnz2TgjAA ==", "list" => {"title" => "Sites Web", "items_attributes" => {"0" => {"title" => " Google "," url "=>" www.google.com "}," 1 "=> {" title "=>" Yahoo "," url "=>" www.yahoo.com "}," 2 "= > {"title" => "Bing", "url" => "www.bing.com"}}}, "commit" => "Créer une liste"} User Load (0.3ms) SELECT "users". * FROM "users" WHERE "utilisateurs". "Id" = $ 1 ORDER BY "utilisateurs". "Id" ASC LIMIT $ 2 [["id", 2], ["LIMIT", 1]] Paramètre non autorisé:: items_attributes (0.1ms) BEGIN SQL (0.9ms) INSERT INTO "listes" ("title", "created_at", "updated_at", "user_id") VALEURS ($ 1, $ 2, $ 3, $ 4) RETURNING "id" [["title", "Sites Web"], ["created_at", "2017-09-19 20: 12: 53.458577"], ["updated_at", "2017-09-19 20: 12: 53.458577 "], [" user_id », 2]] (0.3ms) COMMIT redirigées vers http://localhost:3000/lists/24 Terminé 302 Trouvé dans 7 ms (ActiveRecord: 1,6 ms)

Je suis encore à apprendre, clairement - mais après avoir essayé toutes sortes de conseils sur ce forum je ne pouvais pas comprendre celui-ci. Merci pour toute aide!

Répondre

1

Vous avez des erreurs dans votre syntaxe lorsque vous définissez vos paramètres. Il devrait ressembler à ceci: (articles au lieu article et vous n'avez pas besoin {})

def list_params 
    params.require(:list).permit(:title, 
    items_attributes: [:id, :title, :url]) 
end 
+0

qui a fait l'affaire .... et je l'obtiens - je devais aussi retirer la validation « has_lists? » dans le modèle item.rb afin de faire fonctionner cette configuration. Tu es incroyable. – dstep

+0

droite, vous devez également supprimer cela. Belle prise –

1

Vous y êtes presque, mais il y a une erreur signalées dans ce journaux de votre console: Unpermitted parameter: :items_attributes.

changement item_attributes-items_attributes dans votre list_params:

def list_params 
    params.require(:list) 
     .permit(:title, items_attributes: [:id, :title, :url]) 
end