Примерно так должно работать, если в вашем приложении определен только один краеугольный пользователь:
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
Затем определите помощника в вашем геме (т. Е. В app/helpers/cornerstone_helper.rb
):
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
для получения текущего аутентифицированного пользователя.
Thisметод прерывается, когда acts_as_cornerstone_user
используется в нескольких классах.Но тогда у вас есть проблема с несколькими краеугольными пользователями, которые ничего не знают о моделях приложений (вы должны быть в вашем жемчужине).
Обновление
Есливы хотели бы иметь синтаксис вроде :auth_with => :warden
, вы можете заменить помощника следующим:
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
с Cornerstone::Config::AUTH_MODES
, настроенным так:
module Cornerstone
class Config
AUTH_MODES = {
:warden => Proc.new { |controller| controller.env['warden'].user },
:devise => Proc.new { |controller| controller.current_user }
}
end
end