2009-12-03 3 views
2

У меня есть довольно основные ассоциации:Проблема с has_many: через и fields_for

# 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 часов, я, наконец, получил его работу. Небольшое изменение в код было бы достаточно:

# _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

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

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

- 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 
+0

Это ничего не меняет, хотя хорошо знать, что мне вообще не нужно 'for'. –