2012-04-15 103 views
1

當您嘗試定製其行爲時,我在理解設計如何工作時遇到麻煩。設計僅適用於STI機型嗎?

我有兩個不同的模式來處理:學會合作者,並在報名表必須在他們兩個同樣的觀點。
因此,我必須通過編寫處理兩種模型的新控制器來覆蓋「設計註冊控制器創建方法」

這裏來的痛苦。
從這裏「Devise form within a different controller」和here,我知道我有定義這些新的幫手,使設計作品:

module ContentHelper 
    def resource_name 
    :user 
    end 

    def resource 
    @resource ||= User.new 
    end 

    def devise_mapping 
    @devise_mapping ||= Devise.mappings[:user] 
    end 
end 

而創造的方法,我想重寫是這樣的:

def create 
build_resource 

if resource.save 
    if resource.active_for_authentication? 
    set_flash_message :notice, :signed_up if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_up_path_for(resource) 
    else 
    set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format? 
    expire_session_data_after_sign_in! 
    respond_with resource, :location => after_inactive_sign_up_path_for(resource) 
    end 
else 
    clean_up_passwords resource 
    respond_with resource 
end 

結束

我不知道如何使它的工作原理沒有妥協的監督功能。 (build_resource)。任何建議?我找不到任何解決方案沒有STI使用!

回答

0

這聽起來像你將有一個複雜的模型設置,可能會困擾你的軌道。如果您需要兩種不同的「用戶」模型,也許您仍然可以擁有用戶模型,然後還可以使用Society和Collaborator模型中的每個「has_one:user」。這樣在註冊時創建用戶記錄,以及社會或協作者方法(無論選擇哪一個)。這種方式設計(和你的所有認證)只是鏈接到用戶模型,它保持簡單。

一般來說,如果你發現自己在與穀物作鬥爭,重新評估你正在做的事情是一個好主意。除非你正在做一些開創性的事情,否則很可能事情不會那麼困難。

0

可以定義色器件的所有意見的變量,例如

@type = :society 

def resource_name 
    @type 
end 

,那麼你可以使用原來的控制器和視圖,只是將其添加在AplicationHelper

PD:對於User.new,您可以在eval條件下使用字符串,如

@res = "Society" 

then

@resource ||= eval(@res).new 
相關問題