ProgramingTip

Ruby on Rails 3 :“수퍼 클래스 불일치 ...”

bestdevel 2020. 12. 29. 07:41
반응형

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

어느 한 쪽

  1. 자동 로딩에 의존
  2. 항상 모든 오픈 클래스 발생에 상속을 두십시오.

참조 URL : https://stackoverflow.com/questions/5512023/ruby-on-rails-3-superclass-mismatch-for-class

반응형