2010-04-06 63 views
0

我在用下面的代码麻烦: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

我接近任一类型的在相反方向上的新用户的建筑物。即:

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

re。上述虚拟的属性 - 如果那里的形式,作为用人单位或劳动者区分用户类型是在模型中没有场,因此然后设置中的每个的虚拟属性,你可以把一个隐藏的布尔字段的形式

+0

嘿感谢!我会尝试一下。我应该在创建操作中保存什么?我应该分别保存吗? 我宁愿坚持has_one关联,它似乎更具可扩展性。另外,我现在不太担心空间。 – ferparra 2010-04-06 14:44:29

+0

我认为你需要分开保存两者。 Rails将无法确定多态关系的另一端是哪种类型的模型。尝试| @employer = Employer.new(params [:employer])| @ employer.save | @user = User.new(params [:user] .merge!(:owner => @employer))。您需要从模型中移除accepts_nested_attributes_for。 – mark 2010-04-06 14:59:10

+0

嘿,你的原始表单定义中,你确定你没有在所有者字段中定义用户属性?我会发布另一个答案,因为也许这应该工作。 ^请参阅编辑原始答案。 – mark 2010-04-06 15:00:22