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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top