Аутлогический с вложенными атрибутами и полиморфными ассоциациями - PullRequest
0 голосов
/ 06 апреля 2010

У меня проблемы со следующим кодом:

User < AR
  acts_as_authentic

  belongs_to :owner, :polymorphic => true
end

Worker < AR
  has_one :user, :as => :owner
  accepts_nested_attributes_for :user
end

Employer < AR
  has_one :user, :as => :owner
  accepts_nested_attributes_for :user
end

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

UserRegistrationController < AC
  #i.e. a new Employer
  def new
    @employer = Employer.new
    @employer.build_user
  end
...
end

Затем я включаю поля пользователя с fields_for. Все представления отображаются нормально, но вот в чем проблема: я не могу создать пользователя, он говорит, что :password - неправильный метод, поэтому я предполагаю, что логика аутентификации была обойдена Что я должен делать? Я делаю это неправильно вообще? Должен ли я отбросить полиморфные ассоциации в пользу Single Table Inheritance? Что бы я ни делал, я должен убедиться, что он хорошо сочетается с Authlogic.

1 Ответ

1 голос
/ 06 апреля 2010

Я бы подошел к созданию новых пользователей любого типа в противоположном направлении. то есть:

#controller 
@employer = Employer.new
@user = @employer.build_user

#view
form_for @user |f|
  f.text_field :login
  f.password_field :password
  fields_for :owner, @employer |f_e|
    f_e.some_field :some_value

#controller
def create
  @owner = params[:owner][:some_employer_field_or_virtual_attribute] ? Employer.new params[:owner] : Worker.new params[:owner]
  @owner.save
  @user = User.new(params[:user].merge!(:owner => @owner)
  if @user.save
    ...

повторно. упомянутый виртуальный атрибут - если в модели нет поля и, следовательно, в форме, которая различает тип пользователя как работодателя или работника, тогда установите виртуальный атрибут внутри каждого, который вы можете поместить в виде скрытого логического поля в форме

...