Давайте уточним: у вас есть метод, определенный в модуле, и вы хотите, чтобы этот метод использовался в методе экземпляра.
class MyController < ApplicationController
include Select
# You used to call this in the class scope, we're going to move it to
# An instance scope.
#
# select_for :organization, :submenu => :general
def show # Or any action
# Now we're using this inside an instance method.
#
select_for :organization, :submenu => :general
end
end
Я собираюсь немного изменить ваш модуль. При этом используется include
вместо extend
. extend
для добавления методов класса, а include
для добавления методов экземпляра:
module Select
def self.included(base)
base.class_eval do
include InstanceMethods
end
end
module InstanceMethods
def select_for(object_name, options={})
# Does some operation
self.send(:include, Selector::InstanceMethods)
end
end
end
Это даст вам метод экземпляра. Если вам нужны методы экземпляра и класса, вы просто добавляете модуль ClassMethods и используете extend
вместо include
:
module Select
def self.included(base)
base.class_eval do
include InstanceMethods
extend ClassMethods
end
end
module InstanceMethods
def select_for(object_name, options={})
# Does some operation
self.send(:include, Selector::InstanceMethods)
end
end
module ClassMethods
def a_class_method
end
end
end
Это проясняет ситуацию? В вашем примере вы определили модуль как Select
, но включили Selector
в свой контроллер ... Я просто использовал Select
в своем коде.