Ruby on Rails 3 :“수퍼 클래스 불일치 ...”
플랫폼 : Mac OSX 10.6
터미널에서 "rails c"로 Ruby 콘솔이 시작됩니다.
Ruby on Rails 3 튜토리얼을 따라 클래스를 빌드하는 동안 :
class Word < String
def palindrome? #check if a string is a palindrome
self == self.reverse
end
end
오류 메시지가 나타납니다.
TypeError: superclass mismatch for class Word
from (irb):33
from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands/console.rb:44:in `start'
from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands/console.rb:8:in `start'
from /Users/matthew/.rvm/gems/ruby-1.9.2-p180@rails3tutorial/gems/railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
튜토리얼은 문제가 없음을 보여줍니다. 코드가 괜찮다는 것을 알고 있습니다. 다른 관련 질문을 검색했지만 모두 Ruby 2에서 3 또는 erb 대 eruby로 이전하는 것과 관련이 있습니다.
이미 Word
다른 곳에 정의 된 클래스가 있습니다. Rails 3 앱 내에서 시도했지만 복제 할 수 없습니다.
두 번째 Word
클래스를 직접 생성하지 않는 경우 Gems 또는 플러그인 중 하나가 이미 정의되어 있습니다.
다음과 같이 보관 수도 있습니다.
# /models/document/geocoder.rb
class Document
module Geocoder
end
end
# /models/document.rb
require 'document/geocoder'
class Document < ActiveRecord::Base
include Geocoder
end
이전에 필요한로드 Document
(Object의 수퍼 클래스가 있음) Document < ActiveRecord::Base
(다른 수퍼 클래스가 있음).
Rails 환경에서는 자동 클래스 로딩 기능이 있기 때문에 보통 필요하지 않습니다.
Rails 4 애플리케이션에 문제가 있습니다. 사용자 네임 스페이스 아래에서 우려 사항을 사용했습니다.
class User
module SomeConcern
end
end
(preload_app true라고 추측) 불일치 오류가 발생했습니다. 수정은 매우 간단했습니다. 방금 이니셜 라이저를 추가했습니다.
require "user"
건배!
나는 지금 같은 문제가 있었다. 기본적으로 그것은 단어가 다른 곳에서 클래스로 정의되어 있음을 의미하며 내 생각 엔 그것이 레일 타이 보석에있는 것입니다. Word를 Word2로 변경하면 작동합니다.
우리는 우리가 모르는 사이에 '수업을여십시오'. 예를 들어 몇 가지 깊은 모듈 중첩이 있습니다.
# space_gun.rb
class SpaceGun << Weapon
def fire
Trigger.fire
end
end
# space_gun/trigger.rb
class SpaceGun
class Trigger
end
end
트리거를 정의 할 때 기존 SpaceGun 클래스를 엽니 다. 작동합니다. 그러나 두 파일을 역순으로로드하면 SpaceGun 클래스를 먼저 정의하지만 Weapon이 아니기 때문에 오류가 발생합니다.
때때로 우리는 부모 클래스의 하위 모듈 (예 : 트리거)을 명시 적으로 요구하기 때문에 이러한 실수를합니다. 즉, 클래스 정의가 역순으로 수행되어이 문제가 발생합니다.
# surely nothing can go wrong if we require what we need first right?
require 'space_gun/trigger'
class SpaceGun << Weapon
def fire
Trigger.fire
end
end
# BOOM
어느 한 쪽
- 자동 로딩에 의존
- 항상 모든 오픈 클래스 발생에 상속을 두십시오.
참조 URL : https://stackoverflow.com/questions/5512023/ruby-on-rails-3-superclass-mismatch-for-class
'ProgramingTip' 카테고리의 다른 글
예외 처리를 위해 printStackTrace ()를 사용하는 것이 나쁜 생각입니까? (0) | 2020.12.29 |
---|---|
메뉴에 추가하지 않고 WordPress (0) | 2020.12.29 |
Mongoose에서 하위 문서를 만든 후 채우는 방법은 무엇입니까? (0) | 2020.12.29 |
Laravel 5- 모든 템플릿에서 사용 가능한 전역 블레이드 뷰 변수 (0) | 2020.12.29 |
전체 DOM에서 노드를 감지하는 MutationObserver의 성능 (0) | 2020.12.29 |