включая модули в контроллере - PullRequest
6 голосов
/ 06 августа 2009

Я сделал модуль в каталоге lib в приложении ruby ​​на rails это как

module Select  

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

 module ClassMethods

    def select_for(object_name, options={})

       #does some operation
      self.send(:include, Selector::InstanceMethods)
    end
  end

Я назвал это в контроллере как

include Selector

  select_for :organization, :submenu => :general

но я хочу вызвать это в функции * 1007 то есть *

 def select
  #Call the module here 
 end

1 Ответ

15 голосов
/ 06 августа 2009

Давайте уточним: у вас есть метод, определенный в модуле, и вы хотите, чтобы этот метод использовался в методе экземпляра.

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 в своем коде.

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