2010-04-06 54 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