Как я могу использовать form_for для обновления has_many ассоциации: через ассоциацию - PullRequest
0 голосов
/ 15 марта 2011

В моей форме для member_profile я хотел бы иметь флажки ролей, которые видны для администраторов. Я хотел бы использовать некоторые вложенные form_for, но не могу заставить его работать, поэтому я прибегнул к ручному созданию check_box_tags (см. Ниже), а затем вручную добавил их в member_profile.member.

Обратите внимание, что модель Member является Devise, и я не хочу смешивать эти поля с моими данными MemberProfile на случай, если в будущем я изменю системы аутентификации.

class Member < ActiveRecord::Base
  has_one :member_profile
  has_many :member_roles
  has_many :roles, :through => :member_roles
end
class MemberProfile < ActiveRecord::Base
  belongs_to  :member
  has_many    :member_roles, :through => :member
  #has_many    :roles, :through => :member_roles #can't make this work work
end
class Role < ActiveRecord::Base
  has_many :member_roles
  validates_presence_of :name
end
class MemberRole < ActiveRecord::Base
  belongs_to :member
  belongs_to :role
end

Форма (хамл)

  = form_section do
    - Role.all.each do |x|

      =check_box_tag  'member[role_ids][]', 
                      x.id, 
                      begin @resource.member.role_ids.include?(x.id) rescue nil end
      =x.name

member_profiles_controller.rb

def update
  if @resource.update_attributes params[:member_profile]

    @resource.member.role_ids = params[:member][:role_ids]
    redirect_to(@resource, :notice => 'Member profile was successfully updated.') 
  else
    render :action => "edit" 
  end
end

1 Ответ

0 голосов
/ 18 марта 2011

Я решил, что имеет смысл сделать только вложенный has_many: through при обновлении, поскольку модель соединения - это то, что «проходит», чтобы добраться до модели has_many: through.До создания hmt в модели объединения, очевидно, нет записи.

...