복붙노트

[RUBY-ON-RAILS] 레일 / lib에 모듈과

RUBY-ON-RAILS

레일 / lib에 모듈과

나는 open_flash_chart 플러그인에 대한 사용자 지정 래퍼를 쓰고 있어요. 이 글은 / lib에 배치와 ApplicationController의 모듈로로드합니다.

그러나, 나는 몇 가지 클래스 계층 구조 또는 떨어지게 문제가 있습니다.

어떤 컨트롤러에서 나는 등 OpenFlashChart, 라인 등의 기능을 open_flash_chart에 액세스 할 수 있습니다

그러나, / lib 디렉토리 모듈의 클래스, 그것은 작품을 나던!

어떤 아이디어?

해결법

  1. ==============================

    1.파일을 레일에로드되는 것을 두 가지 방법이 있습니다 :

    파일을 레일에로드되는 것을 두 가지 방법이 있습니다 :

    LIB는 부하 경로에 있기 때문에, 두 가지 옵션이 있습니다 : 레일이 자동으로 문제의 상수를 참조 할 때 그들을 데리러, 또는 명시 적으로 모듈을 필요로하므로 하나, 상수와 같은 이름을 가진 파일의 이름을 지정합니다.

    나는 또한 당신이 다른 일에 대해 혼동 될 수 있음을 알 수 있습니다. 와 ApplicationController는 시스템의 루트 개체가 아닙니다. 관찰 :

    module MyModule
      def im_awesome
        puts "#{self} is so awesome"
      end
    end
    
    class ApplicationController < ActionController::Base
      include MyModule
    end
    
    class AnotherClass
    end
    
    AnotherClass.new.im_awesome
    # NoMethodError: undefined method `im_awesome' for #<AnotherClass:0x101208ad0>
    

    당신은 당신이 그것을에 사용하려는 어떤 클래스에 모듈을 포함해야합니다.

    class AnotherClass
      include MyModule
    end
    
    AnotherClass.new.im_awesome
    # AnotherClass is so awesome
    

    물론, 처음에 모듈을 포함 할 수 있도록하기 위해, 당신은 (기술 위 중 하나 사용)가 사용할 수 있어야합니다.

  2. ==============================

    2.레일 3 / lib에 모듈이 자동으로로드되지 않습니다.

    레일 3 / lib에 모듈이 자동으로로드되지 않습니다.

    이 라인 때문입니다 :

    # config.autoload_paths += %W(#{config.root}/extras)
    

    내부 설정 / application.rb은 주석.

    이 행의 주석을 시도하거나, (그것은 더 나은 나를 위해 일한), 떠날이 (미래 참조) 주석이 두 줄을 추가 할 수 있습니다 :

    config.autoload_paths += %W(#{config.root}/lib)
    config.autoload_paths += Dir["#{config.root}/lib/**/"]
    
  3. ==============================

    3.어떤 것은 (내가 레일 3.1.3에있어) config.autoload_paths 주석을 해제 외에, 나를 위해 일한,이 같은 이니셜을 만드는 것이 었습니다 :

    어떤 것은 (내가 레일 3.1.3에있어) config.autoload_paths 주석을 해제 외에, 나를 위해 일한,이 같은 이니셜을 만드는 것이 었습니다 :

    #config/initializers/myapp_init.rb
    require 'my_module'    
    include MyModule
    

    이 방법 나는 어디에서와 같은 클래스 메소드 Model.mymodule_method 또는 인스턴스 메소드 mymodel.mymodule_method로 인 MyModule 메소드를 호출 할 수 있습니다

    어쩌면 일부 전문가는 이것의 의미를 설명 할 수 있습니다. 지금까지, 당신의 자신의 위험에 그것을 사용할 수 있습니다.

    편집 : 그 후, 나는 더 나은 방법이있을 거라고 생각 :

    이 같은 초기화를 만들 :

    #config/initializers/myapp_init.rb
    require ‘my_module’
    

    이런 식으로, 필요한 모듈을 포함합니다 :

    당신이 "클래스 방법"을 사용로 사용하려는 경우 1) "확장"

    class Myclass < ActiveRecord::Base
       extend MyModule
       def self.method1
          Myclass.my_module_method
       end
    end
    

    2) "인스턴스 메소드는"클래스 정의 내부를 포함로 사용하려는 경우 :

    class Myclass < ActiveRecord::Base
    include MyModule
       def method1
          self.my_module_method 
       end
    end
    

    3) 인 MyModule 먼저 요구해야 부하 경로에 파일 my_module.rb을 의미 포함하는 기억

  4. ==============================

    4.당신의 모델과 컨트롤러의 모듈 lib 디렉토리 / my_module.rb을 사용하려면 :

    당신의 모델과 컨트롤러의 모듈 lib 디렉토리 / my_module.rb을 사용하려면 :

    에서 설정 / application.rb :

    config.watchable_dirs['lib'] = [:rb]
    

    모델 (컨트롤러에 대한 비슷한 아이디어)에서 :

    require_dependency 'my_module'
    
    class MyModel < ActiveRecord::Base
      include MyModule
    
      MyModule.some_method
    end
    

    이 방법은 http://hakunin.com/rails3-load-paths에서 더 상세히 설명된다

  5. ==============================

    5.당신이 명시 적으로 응용 프로그램 초기화시의 lib 디렉토리에 파일을로드하려는 경우 일 수 있습니다. 내 설정 / application.rb, 나는 그것이 파일에서와 같이 또한이 모듈 이름 / 계층 구조가 동일하지 않습니다 경우 수 있습니다 (# {config.root} / lib에) W, config.autoload_paths가 + = % 등의 항목이 해당 파일의 자동 부하도 가능되지 않도록 또는 파일의 위치 / 이름은 해당 계층과 동일하지 않습니다. 내가 설정 / application.rb 등의 맨 아래에 항목을 추가 할 때 그래서, ./lib/file_name_without_extention가 잘 일했다 "필요합니다.

    당신이 명시 적으로 응용 프로그램 초기화시의 lib 디렉토리에 파일을로드하려는 경우 일 수 있습니다. 내 설정 / application.rb, 나는 그것이 파일에서와 같이 또한이 모듈 이름 / 계층 구조가 동일하지 않습니다 경우 수 있습니다 (# {config.root} / lib에) W, config.autoload_paths가 + = % 등의 항목이 해당 파일의 자동 부하도 가능되지 않도록 또는 파일의 위치 / 이름은 해당 계층과 동일하지 않습니다. 내가 설정 / application.rb 등의 맨 아래에 항목을 추가 할 때 그래서, ./lib/file_name_without_extention가 잘 일했다 "필요합니다.

  6. from https://stackoverflow.com/questions/1073076/rails-lib-modules-and by cc-by-sa and MIT license