具有嵌套属性和多态关联的Authlogic

时间:2010-04-06 01:07:29

标签: ruby-on-rails activerecord authlogic

我遇到以下代码时出现问题:

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是一个错误的方法,所以我猜认证逻辑已被绕过。 我该怎么办?我做错了吗?我是否应该放弃多态关联以支持单表继承?无论我做什么,我都必须确保它与Authlogic很好地配合。

1 个答案:

答案 0 :(得分:1)

我将以相反的方向构建任何一种类型的新用户。即:

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

重。提到的虚拟属性 - 如果模型中没有字段,因此在表单中将用户类型区分为雇主或工作人员,则在每个字段中设置一个虚拟属性,您可以将其作为隐藏的布尔字段放在表单中