Question

J'ai une association assez basique:

# 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

L'abonnement a également une colonne booléenne « notification » que je dois configurer individuellement, donc je regardé dans le API , a suivi l'exemple et est venu avec ce code pour ma forme:

- 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

Mais quand je sauve le formulaire, tous les abonnements associés sont détruits. Alors quand je cochez la case Il ne sera pas supprimé, mais la case à cocher est pas enregistré soit . Est-ce que quelqu'un sait ce que je fais mal?

Était-ce utile?

La solution

Après avoir essayé autour pendant près de 2 heures, je l'ai finalement obtenu de travail. Un léger changement à votre code aurait été suffisant:

# _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
# […]

Parce que params[:user][:service_ids] était vide, elle a supprimé toute association.

Autres conseils

Vous n'êtes pas soumettre des abonnements avec la forme. Sans cliquer la case à cocher, vous avez rien à soumettre à cet abonnement, de sorte que les abonnements sont en cours anéanties par la fonctionnalité d'attributs imbriqués. Essayez de mettre dans un champ caché avec l'identifiant de service de l'abonnement.

Je crois que vous êtes également la mise en place sous la forme d'attributs imbriqués de manière incorrecte. Essayez ceci:

- 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top