Problem has_many: durch und fields_for
-
12-09-2019 - |
Frage
Ich habe eine ziemlich grundlegende Assoziation:
# 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
Das Abonnement hat auch eine boolesche Spalte „Benachrichtigung“, die ich einzeln konfigurieren müssen, so dass ich sah in die API , folgten dem Beispiel und kam mit diesem Code für meine Form bis:
- 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
Aber wenn ich das Formular speichern, werden alle zugehörigen Abonnements zerstört werden. Während, wenn ich die Checkbox gelöscht werden wont, aber das Kontrollkästchen wird nicht gespeichert entweder . Weiß jemand, was ich falsch mache?
Lösung
Nach dem Versuch, für fast 2 Stunden um, ich habe es endlich funktioniert. Eine geringfügige Änderung an Ihrem Code hätte genug gewesen:
# _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
# […]
Da params[:user][:service_ids]
leer war, gelöscht es den ganzen Verein.
Andere Tipps
Sie sind nicht alle Abonnements mit dem Formular einzureichen. Ohne das Kontrollkästchen klicken, haben Sie nichts für das Abonnement zu unterbreiten bekommen, so dass die Abonnements werden durch die verschachtelten Attribute Funktionalität ausgelöscht. Versuchen Sie, in einem versteckten Feld setzt mit Abonnement-Service-ID.
Ich glaube, Sie auch falsch das Formular für verschachtelte Attribute einrichten. Versuchen Sie folgendes:
- 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