2012-10-05 4 views
2

배열의 기능을 확장하고 배열에 키가 있는지, 배열이 비어 있지 않은지, 클래스를 작성할지, 어떻게로드되는지 확인하는 메서드를 추가하고 싶습니다. ?레일 앱의 클래스 위치

답변

2

lib/에 코드를 넣어이 config/application.rb에 줄을 추가하여 레일에 의해 자동으로 적재되고 있는지 확인하는 것입니다 할 수있는 표준 방법 : 다음

config.autoload_paths += Dir["#{config.root}/lib/**/"] 

을 코드에서, 당신이 어디에 있든 당신을 필요로 확인 그걸 써. 당신이 사방을 적용 할 경우 라인 config/initializers의 초기화를 만듭니다

my_array.rb 당신이 파일이 lib에있는 파일의 이름입니다
require 'my_array' 

. 즉,도

참조 등, 귀하의 모델, 컨트롤러, 뷰에서 사용할 수 있도록합니다 Best way to load module/class from lib folder in Rails 3? 또한

, 루비 (뿐만 아니라 레일)의 디렉토리 구조를 자동 로딩 중 하나 개 함정 조심,이 답변에 설명 : Best way to load module/class from lib folder in Rails 3?

3

lib/에 넣을 수 있으며 답변에 설명 된대로 자동로드되도록 할 수 있습니다. 또는 이니셜 라이저에 넣을 수 있습니다. 나는 이니셜 라이저 접근법을 조금 더 좋아한다. 왜냐하면 더 쉽기 때문이다 (당신은 자동 로딩을 얻는다).

보통 initializers 디렉토리의 하위 디렉토리 core_ext을 만들고 여기에 핵심 클래스 확장을 넣습니다.

module MyFunctionForArray 
    def my_function(arg1, arg2) 
    # ... 
    end 
end 

Array.send :include, MyFunctionForArray 

난 항상 다시하지하려고 : 당신이 경우에 내가 포함 된 파일 RAILS_ROOT/config/initializers/core_ext/array_my_function을 만들 것이다, 그래서 나는 항상 확장되고있는 클래스와 I가 파일 이름에 추가에 대한 설명의 이름을 넣어 시도 클래스를 직접 확장하고 내 확장을 모듈에 넣고이 모듈을 클래스에 포함하여 확장합니다.

+0

이니셜 라이저에서도 사용하지만 클래스를 다시 사용했습니다. 클래스를 다시 열지 않고 모듈을 포함하는 접근 방식에 이점이 있습니까? – rubyprince

+1

내 의견으로는 모든 확장을 포함하는 모듈을 포함 할 때 원래 클래스를 오염시키지 않아야합니다. 원래 클래스의 조상 체인에 하나의 새 요소를 추가하는 대신 클래스에 X 개의 새 메서드를 직접 추가하는 것이 좋습니다. 그리고 메소드가 정의 된 곳을 알아 내야 할 때 도움이됩니다 :'[1,2,3] .method (: my_function)'예를 들어 메소드 * my_function *은 클래스 자체가 아니라 모듈에서 온다고 알려줍니다 그러므로 쉽게 찾을 수 있습니다 ... – severin

+0

ok .. 그게 말이 되네. 감사합니다. – rubyprince

관련 문제