2013-10-11 5 views
4

인상파 보석 클래스 "인상"을 수정하려고합니다.레일스의 인상파 보석에서 인상 수업을 다시 엽니 다.

class Impression 
    def hello 
    "world" 
    end 
end 

Impression.class_eval do 
end 

모두에 :

나는 다음 시도했다 /app/models/impression.rb 및 /lib/impression.rb (올바른 구성하여이 폴더를 포함)

내가 뭘 잘못하고 있니? Rails 4를 사용하고 있습니다. 이상적으로는 활성 레코드 연결을 추가하고 도우미 메서드를 추가하고 싶습니다.

+0

오류 메시지 또는 오류는 무엇입니까? 또한 이러한 수정 사항을 어떻게 사용하려고했는지 보여줄 수 있습니까? 첫 번째 시도는 유효한 Ruby가 무엇이든 관계없이 '인상'이 미리 정의 된 두 번째 유효합니다. 그러나'Impression' 클래스는 Rails 앱에서 생각하는 역할을하지 않을 수도 있습니다. –

+0

안녕하세요가 존재하지 않는다는 표준 오류 메시지입니다 ... – ckarbass

답변

1

당신이 보석에서 제공하는 클래스를 오버라이드 (override)하는 경우, 수동으로 변경 사항이 포함 얻을 버전을 요구해야합니다. 이것은 일반적으로 초기화 프로그램에서 수행됩니다.

+0

예를 들어 주거나 ​​설명을 해주시겠습니까? lib/impression.rb에 클래스를 정의한 다음 confing/initializers/impression.rb에 'lib/impress.rb'가 필요합니다. – ckarbass

+0

@ckarbass 클래스를로드 경로의 어느 곳에 나 정의 할 수 있습니다 (app/모델 ')을 사용하고 있기 때문에 이니셜 라이저에서 필요합니다 (예 :'require'impression''). – sevenseacat

+1

나는 Impression 클래스를 덮어 쓰고 싶기 때문에 비슷한 것을 시도했다. 나는 레일즈 3을 사용하고 있으며,이 솔루션은 나에게 도움이되지 못했다. 추가 구성을 수행 했습니까? – KavitaC

1

나는이 보석에 대해 이야기하고 있다고 가정합니다 : https://github.com/charlotte-ruby/impressionist 및 모델 클래스 Impression을 변경하고 싶습니다.

내가 볼 수있는 것은 레일 엔진으로되어 있습니다.

레일 엔진이 네임 스페이스로 사용되는 경우 스택 추적에서이를 나타낼 수 있습니다.

시도해 보셨습니까?

# app/extensions/impressionist/impression.rb 
module Impressionist 
    class Impression 
    def hello 
     "world" 
    end 
    end 
end 

로드 순서 문제 일 수도 있으므로 코드를 이니셜 라이저에 넣을 수도 있습니다.

+0

감사하지만 작동하지 않았습니다. – ckarbass

+0

디버깅 목적으로 gem을 열고 파일'puts caller'의 맨 위에 올려 놓거나 예외를 발생 시키십시오. 그런 식으로 클래스가로드되는지, 언제로드되는지를 알 수 있습니다. – phoet

1

이 시도 :

require Impressionist::Engine.root.join('lib/impressionist/models/active_record/impression') 

class Impression 
    def hello 
    "world" 
    end 
end 
+0

감사하지만 작동하지 않았습니다. – ckarbass

+0

확인 거기에 몇 가지 클래스가 정의되어 혼란 스럽습니다. – apneadiving

+0

updated.rb (내 확장)가 중요한지는 확인하십시오. 나는 그것을 다시 시도 할 것이다. – ckarbass

1

concern을 사용하여 고유 한 메서드를 사용하여 모델 클래스를 확장해야합니다. 당신의 lib 폴더에 파일이 퍼팅 시도하고는 초기화에 필요 : 어떤 모델

require Impressionist::Engine.root.join('lib/impressionist/models/active_record/impression') 

module ImpressionExtensions 
    extend ActiveSupport::Concern 

    def some_instance_method 
    # do some stuff 
    end 

    module ClassMethods 
    def some_class_method 
     # do some stuff 
    end 
    end 

end 

Impression.send(:include, ImpressionExtensions) 

추가 방법은 유사한 방식으로 수행해야합니다. 인상파가 작동하는 방식은 우선적으로 Impression 클래스를 재정의하고 모델로 만들기 전에 일반 클래스의 독립 실행 형 클래스로 정의한다는 점에서 조금 다릅니다.