2011-01-11 15 views
1

このタイトルは実際にはすべてを説明していないため、ここに入ります。私はいくつかの機能(すなわち、ユーザーモデルと認証)を共有する2つのRailsエンジンを持っています。私は基本Userクラスを持っているし、そのようになどの各アプリのために、この基本クラスから継承する二つの他のユーザークラス:Rubyで現在のインスタンスモジュールを取得する方法

class User; end 
class App1::User < ::User; end 
class App2::User < ::User; end 

私の認証が含まれている以下の

def user_from_session 
    User.find_by_id(session[:user_id]) 
end 

と同様の方法を持っています私のapplication_controllerで。私の問題は、ユーザーがフェッチされたときに、常にベースのUserクラスを使用することです。私が本当に望むのは、そのメソッドを呼び出すアプリケーションと同じタイプのUserを取得できることです。例えば

、ユーザーがSomeController上にある場合:

class App1::SomeController < ApplicationController; end 

私はそれがApp1::Userをインスタンス化するだけではなく、User

は、このされるようにapplication_controllerのメソッドがApp1を引き出したいです可能?

私は2つのuser_from_sessionメソッドを含む解決策を探しているわけではありません。私はそれを実装する方法を認識しています。 Rubyでこのタイプのことが可能かどうかを知ることにもっと興味があります。

+0

? –

+0

ああ申し訳ありませんが、それはapplication_controllerのbefore_filterから呼び出されています...実際にそこの 'current_user'メソッドから呼び出されました – brad

答えて

0

私はこれを行うには良い、より少ないハック方法を見つけるためにあなたを警告したいけれども、ここにあなたがそれを行う可能性があります方法は次のとおりです。

あなたはから `user_from_session`メソッドを呼び出します
def user_from_session 
    # App1::Whatever::FooController -> App1::Whatever 
    module_name = self.class.name.split('::')[0..-2].join('::') 
    # App1::Whatever -> App1::Whatever::User 
    user_class = "#{module_name}::User".constantize 
    # App1::Whatever::User.find_by_id(...) 
    user_class.find_by_id(session[:user_id]) 
end 
+0

これをテストしたことはありませんでした。私はコントローラを再構成して、各アプリケーションにuser_from_sessionメソッドを定義する独自のapplication_controllerが継承されるようにしました。私はこれをテストしなければならなかったが、私はそれが正常に動作したと仮定してマークを付けるだろう... – brad

関連する問題