2012-05-17 2 views
1

/lib에 고유 한 메서드가있는 파일이 있습니다.Ruby에서 외부 클래스의 메서드를 호출하는 방법

# lib/file.rb 
class File < ApplicationController 
    def my_method 
    ... 
    end 
end 

그러나 나는 콘솔

ruby-1.9.2-p290 :044 > File.my_method 
NoMethodError: undefined method `my_method' for File:Class 

방법 어떤 생각을 통해 방법을 도달 할 수없는 이유는 무엇입니까?

답변

4

my_methodFile 클래스의 인스턴스 메서드입니다. 즉, File 클래스의 인스턴스에서만 호출 할 수 있습니다.

file = File.new 
file.my_method 

당신은 def self.my_method 구문을 사용하여 클래스의 방법으로 my_method을 선언 할 수 있습니다.

class File < ApplicationController 
    def self.my_method 
    ... 
    end 
end 

File.my_method 

그러나 클래스 메서드에서는 File 개체의 인스턴스 변수를 사용할 수 없습니다.

1

my_method을 클래스 메소드로 호출하려하지만이를 인스턴스 메소드로 정의했습니다.

def self.my_method으로 정의하거나 컨트롤러의 인스턴스를 만들어 인스턴스 메서드로 호출해야합니다.

또한 레일에 컨트롤러 이름이 FilesController이고 (2) File이 표준 라이브러리의 클래스라고 예상되는 경우 몇 가지 이유로 문제가 발생합니다. 두 가지 문제를 방지하려면 클래스 이름을 FilesController으로 변경하고 파일 이름을 files_controller.rb으로 바꾸십시오.

0

음 ...이 예제에서는 몇 가지 흥미로운 점이 있습니다. 첫 번째는이 클래스 이름이 이미 Ruby에 정의 된 File 호출이라고합니다.

콘솔에있을 때 정의되지 않은 클래스 오류가 발생하지 않았을 가능성이 가장 높습니다. my_method은 Ruby의 File 클래스에 정의되어 있지 않으므로 정의되지 않은 메소드가 표시됩니다.

질문에 답변드립니다. 수업 이름을 먼저 다른 이름으로 지정하고 lib에서 다시 시도해 보겠습니다. 난 레일 환경과 기본적으로 다시로드해야한다고 생각합니다. 기능이 제거 된 버전 또는 두 버전의 경우 다시 들어 왔음을 나타내려고합니다. 그렇지 않다면 config/application.rb 파일로 이동하여 config.autoload_paths 라인을 따라 신고하십시오. 거기에 lib 디렉토리를 추가하면 좋을 것입니다.

마지막으로 컨트롤러를 lib에 넣으려는 이유가 있습니까?

관련 문제