Проблема с has_many: through и fields_for - PullRequest
2 голосов
/ 03 декабря 2009

У меня довольно простая ассоциация:

# 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

В подписке также есть логический столбец «уведомление», который мне нужно настроить индивидуально, поэтому я посмотрел на API , последовал примеру и придумал код для своей формы:

- 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

Но при сохранении формы все связанные подписки уничтожаются. Принимая во внимание, что когда я проверяю флажок, он не будет удален, , но флажок также не сохраняется . Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

Попробовав почти 2 часа, я наконец заработал. Небольшого изменения в вашем коде было бы достаточно:

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

Поскольку params[:user][:service_ids] был пуст, он удалил всю ассоциацию.

0 голосов
/ 03 декабря 2009

Вы не отправляете подписки с формой. Не устанавливая флажок, вы ничего не можете отправить для этой подписки, поэтому подписки уничтожаются с помощью функции вложенных атрибутов. Попробуйте ввести скрытое поле с идентификатором услуги подписки.

Полагаю, вы также неправильно настраиваете форму для вложенных атрибутов. Попробуйте это:

- 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
...