2011-07-27 24 views
1

親アプリケーションのUserモデルとの関係を確立するために、 "acts as"形式を使用するレールエンジンを構築しています。rails 3.1エンジンから親アプリケーションのヘルパーメソッドを呼び出す方法

module Cornerstone 

    module ActsAsCornerstoneUser 

    extend ActiveSupport::Concern 

    module ClassMethods 

     def acts_as_cornerstone_user(options = {}) 

     #= Associations 
     has_many :cornerstone_discussions 


     #= Options 
     Cornerstone::Config.auth_with << options[:auth_with] if options[:auth_with] 
     Cornerstone::Config.auth_with.flatten! 

     end 
    end 

    module InstanceMethods 

    end 

    end 

    ActiveRecord::Base.send :include, ActsAsCornerstoneUser 

end 

私は:auth_withオプションを使用して、ヘルパーメソッド名を指定することができるようにする開発者のためにしたいと思います。アイデアは、開発者が親アプリケーション内でそのセッションのサインインしたユーザーを返すヘルパーメソッドを指定することです。

私の質問は、開発者がauth_withオプションを指定した後で、その親アプリケーションのメソッドをどのように呼び出すことができますか?

親アプリケーションのサインインユーザーを取得する方が良いでしょうか?私はそれが単にcurrent_userを呼び出すことに依存しないようにできるだけ柔軟なものにしたいと思います。

+0

1人または複数の礎石ユーザーが必要ですか? (つまり、1つの認証方法またはクラスごとに1つ) –

+0

また、認証はコントローラのジョブである必要があります。認証されたユーザーはどこに必要ですか? –

+0

認証されたユーザーはエンジンのコントローラ内で必要になりますが、認証は親アプリケーションで行われます。 – astjohn

答えて

2

このような何かが、限り、あなたはあなたのアプリケーションで定義された唯一の礎石のユーザ持っているように、動作するはずです:(。すなわちapp/helpers/cornerstone_helper.rbに)次に、あなたの宝石でヘルパーを定義

module Cornerstone 
    module ActsAsCornerstoneUser 
    extend ActiveSupport::Concern 

    module ClassMethods 
     def acts_as_cornerstone_user(options = {}) 

     #= Associations 
     has_many :cornerstone_discussions 

     #= Options 
     Cornerstone::Config.auth_with = options[:auth_with] if options[:auth_with] 
     end 
    end 

    module InstanceMethods 

    end 

    def self.included(base) 
     base.extend(ClassMethods) 
     base.include(InstanceMethods) 
    end 
    end 

    ActiveRecord::Base.send :include, ActsAsCornerstoneUser 
end 

を:

module Cornerstone 
    module CornerStoneHelper 
    def current_cornerstone_user 
     Config.auth_with.call(controller) 
    end 
    end 
end 

acts_as_cornerstone方法は次のように使用される:

class MyUser < ActiveRecord::Base 
    acts_as_cornerstone_user :auth_with => Proc.new { |controller| controller.current_user } 
end 

これで、current_cornerstone_userヘルパーを使用して、現在認証されているユーザーを取得できます。

acts_as_cornerstone_userが複数のクラスで使用されている場合、この方法は中断されます。しかし、アプリケーションモデル(あなたはあなたの宝石の中にあるはずです)について何も知らなくても、複数の基礎ユーザーを抱えるという問題があります。このように設定Cornerstone::Config::AUTH_MODES

module Cornerstone 
    module CornerStoneHelper 
    def current_cornerstone_user 
     if Config.auth_with.respond_to?(:call) 
     Config.auth_with.call(controller) 
     elsif Config::AUTH_MODES.keys.include?(Config.auth_with) 
     Config::AUTH_MODES[Config.auth_with].call(controller) 
     end 
    end 
    end 
end 

更新

あなたは:auth_with => :wardenような構文を持っているしたい場合は、次のようにヘルパーを置き換えることができ

module Cornerstone 
    class Config 
    AUTH_MODES = { 
     :warden => Proc.new { |controller| controller.env['warden'].user }, 
     :devise => Proc.new { |controller| controller.current_user } 
    } 
    end 
end 
+0

ありがとう!私はこれを試してみるでしょうが、複数のユーザークラスがあるとどうなりますか?たとえば、Userクラスなどのものを継承するAdminクラス...可能な限り柔軟にエンジンを作成しようとしています。親アプリケーション内で定義されているcurrent_userメソッドを呼び出すことが、私が考え出す最も良い方法です。理想的には、上で概説したようなものを使用したいと思います:auth_with =>:warden。防御事件ははるかに簡単です。 – astjohn

+0

私は自分の答えを更新しました。これはあなたが気にしていたものですか? –

+0

あなたのソリューションを試してみる時間がありました。残念ながら、モデル内にProcを指定することは、モデルがコントローラオブジェクトへのアクセス権を持たないために機能しないと思います。あなたがもっと見たいと思えば、ソースはgithubにあります... https:// github。com/astjohn/cornerstone – astjohn

関連する問題