Как вызвать вспомогательный метод родительского приложения из движка rails 3.1 - PullRequest
1 голос
/ 27 июля 2011

Я создаю движок rails, который использует формат «действует как» для установления отношений с моделью пользователя родительского приложения.

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.

1 Ответ

2 голосов
/ 07 августа 2011

Примерно так должно работать, если в вашем приложении определен только один краеугольный пользователь:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...