Problema con has_many: attraverso e fields_for
-
12-09-2019 - |
Domanda
Ho un'associazione piuttosto semplice:
# user.rb
class User < ActiveRecord::Base
has_many :services, :through => :subscriptions
has_many :subscriptions, :accessible => true
accepts_nested_attributes_for :subscriptions
end
# service.rb
class Service < ActiveRecord::Base
has_many :users, :through => :subscriptions
has_many :subscriptions
end
# subscription.rb
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :service
end
La sottoscrizione è anche una colonna booleana "notifica", che ho bisogno di configurare individualmente, così ho guardato nel API , ha seguito l'esempio e si avvicinò con questo codice per la mia forma:
- if current_user.subscriptions.length > 0
%fieldset#subscriptions
%legend Abonnements
%table
%tr
%th.name
%th.notification Notifications?
- for subscription in current_user.subscriptions do
%tr
- f.fields_for :subscriptions, subscription do |s|
%td=subscription.service.name
%td= s.check_box :notification
Ma quando ho salvare il modulo, tutti gli abbonamenti associati vengono distrutti. Mentre quando posso controllare la casella di controllo che non sarà cancellato, , ma la casella di controllo non viene salvato o . Qualcuno sa che cosa sto facendo male?
Soluzione
Dopo aver cercato in giro per quasi 2 ore, ho finalmente capito di lavoro. Una leggera modifica al codice sarebbe stato sufficiente:
# _form.html.haml
# […]
- if current_user.subscriptions.length > 0
%fieldset#subscriptions
%legend Abonnements
%table
%tr
%th.name
%th.notification Notifications?
- f.fields_for :subscriptions do |sub|
%tr
%td= sub.object.service.name
%td
= sub.check_box :notification
= hidden_field_tag "user[service_ids][]", sub.object.service.id
# […]
A causa params[:user][:service_ids]
era vuota, è cancellata l'intera associazione.
Altri suggerimenti
Non stai presentando alcun abbonamento con la forma. Senza fare clic sulla casella di controllo, non hai niente di sottoporre tale sottoscrizione, in modo che le sottoscrizioni sono essere spazzato via dalla funzionalità attributi nidificato. Prova a mettere in un campo nascosto con l'abbonamento al servizio id.
Credo che anche sta configurando il modulo per gli attributi nidificati in modo errato. Prova questo:
- if current_user.subscriptions.length > 0
%fieldset#subscriptions
%legend Abonnements
%table
%tr
%th.name
%th.notification Notifications?
- f.fields_for :subscriptions do |sub|
%tr
%td= sub.object.service.name
%td
= sub.check_box :notification
= sub.hidden_field :service_id