2012-04-15 3 views
1

私は、その動作をカスタマイズしようとするときにdeviseがどのように動作するのかを理解するのに苦労しています。DeviseはSTIモデルでのみ動作しますか?

私が処理するために、2つの異なるモデルがあります:社会コラボレーターをし、登録フォームには、それらの両方のための同じビューにしておく必要があります。
したがって、「登録コントローラを作成する」デバイスをオーバーライドして、両方のモデルを処理する新しいコントローラを作成する必要があります。

ここに痛みがあります。 「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 

end

保護者機能を損なうことなく動作させる方法を理解できません。 (build_resource)。なにか提案を? STIを使用して解決策を見つけることができません!

答えて

0

複雑なモデル設定をしてトラックを悩ませているようです。 2つの異なる「ユーザー」モデルが必要な場合は、依然としてUserモデルを持つことができ、それぞれのhas_one:userというSocietyモデルとCollaboratorモデルを使用することもできます。そのようにサインアップすると、ユーザーレコードと、ソーシャルまたはコラボレーターの方法(選択されたいずれか)が作成されます。そうすれば、あなたのすべての認証はユーザーモデルにリンクされ、単純なままです。

一般的に、自分が穀物と戦っていると感じたら、自分がしていることを再評価することをお勧めします。あなたが何か画期的なことをやっていない限り、物事はそれほど難しくないはずです。

0

あなたは、あなたは、元のコントローラとビューを使用することができ、そしてちょうどAplicationHelperにそれを追加例えば

@type = :society 

def resource_name 
    @type 
end 

、工夫のすべてのビューで変数を定義することができます

PD:User.newの場合、評価状況では文字列を使用できます。

その後、
@res = "Society" 

@resource ||= eval(@res).new 
関連する問題