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!
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
droite, vous devez également supprimer cela. Belle prise –