我遇到以下代码时出现问题:
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很好地配合。
答案 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
...
重。提到的虚拟属性 - 如果模型中没有字段,因此在表单中将用户类型区分为雇主或工作人员,则在每个字段中设置一个虚拟属性,您可以将其作为隐藏的布尔字段放在表单中