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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top