[RUBY-ON-RAILS] 레일 / lib에 모듈과
RUBY-ON-RAILS레일 / lib에 모듈과
나는 open_flash_chart 플러그인에 대한 사용자 지정 래퍼를 쓰고 있어요. 이 글은 / lib에 배치와 ApplicationController의 모듈로로드합니다.
그러나, 나는 몇 가지 클래스 계층 구조 또는 떨어지게 문제가 있습니다.
어떤 컨트롤러에서 나는 등 OpenFlashChart, 라인 등의 기능을 open_flash_chart에 액세스 할 수 있습니다
그러나, / lib 디렉토리 모듈의 클래스, 그것은 작품을 나던!
어떤 아이디어?
해결법
-
==============================
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.레일 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.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.당신의 모델과 컨트롤러의 모듈 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.당신이 명시 적으로 응용 프로그램 초기화시의 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가 잘 일했다 "필요합니다.
from https://stackoverflow.com/questions/1073076/rails-lib-modules-and by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 더 하나 개의 속성보다 find_or_create_by 레일? (0) | 2020.02.10 |
---|---|
[RUBY-ON-RAILS] 팝업으로 omniauth 페이스 북의 로그인을 돌려 (0) | 2020.02.10 |
[RUBY-ON-RAILS] 나는 그것을 제거에 무엇을 ". 응답 본문의 내용 길이를 결정할 수 없습니다 WARN"평균 얼마나됩니까? (0) | 2020.02.10 |
[RUBY-ON-RAILS] 열에서 선택 고유 한 값 : 레일 (0) | 2020.02.10 |
[RUBY-ON-RAILS] 어떻게 레일에 모델 속성이 발견합니까? (0) | 2020.02.10 |