Попытка понять, как контроллер использует плагин / модуль - PullRequest
1 голос
/ 25 октября 2010

Хорошо, поэтому я использую некоторый модуль / lib / plugin (не уверен в точном названии), скажем, это плагин аутентификации / авторизации, например: http://github.com/technoweenie/restful-authentication

class HomeController < ApplicationController


    some_module_name_here


end

Теперь, просто добавив код выше 'some_module_name_here', я могу получить доступ к методам из этого модуля.

Что делает эта строка кода, которая дает мне доступ к методам / объектам из модуля?

Это объявление переменной, как, скажем, в java / c #:

public SomeModule _someModule; 

Я знаю, что плагины / модули в основном расширяют класс под прикрытием, но как это сделать с помощью одной строки кода?

Это как-то вызывается в конструкторе?

Ответы [ 2 ]

4 голосов
/ 25 октября 2010

Когда вы создаете плагин ruby ​​и загружаете его в приложение rails с помощью environment.rb, bundler или вызова require, методы загружаются как «модули», которые можно вызывать. Те, которые действуют так, как вы говорите, будут иметь дополнительный метод под названием acts_as_list или что-то подобное. Все, что делает этот метод, это включает методы модуля в класс, где была вызвана эта строка.

Вот пример, который вы можете включить в папку lib вашего приложения и поиграть с ним:

module Bellmyer
  module Pointless
    def self.included(base)
      base.extend PointlessMethods
    end

    module PointlessMethods
      def acts_as_pointless
        unless included_modules.include? InstanceMethods
          extend ClassMethods
          include InstanceMethods
        end
      end
    end

    module ClassMethods
      def pointless_class?
        true
      end
    end

    module InstanceMethods
      def pointless_instance?
        true
      end
    end
  end
end

Модуль доступен для любого класса ruby ​​в вашем приложении, но методы фактически не загружаются, пока вы не вызовете acts_as_pointless, который затем включает и расширяет ваш класс перечисленными методами. Только метод acts_as_pointless сразу доступен для модели. Это стандартный шаблон для плагина ActiveRecord.

2 голосов
/ 25 октября 2010

Это не так, как это работает.

Когда плагин или гем загружается, он добавляет метод класса, в данном случае ApplicationController с именем some_module_name. Когда вы вызываете эти методы, включается куча других методов класса и экземпляра.

Проверьте ваш любимый драгоценный камень или плагин, чтобы увидеть, как они делают это точно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...