2014-11-20 3 views
1

나는 after_create 콜백을 가진 ActiveRecord :: Base로부터 상속받은 클래스를 가졌다. 콜백 내부에서, 아래 그림과 같이 내가 상수를 만듭니다메서드 종료 후 루비 상수가 삭제 되었습니까?

class ClassificationCode < ActiveRecord::Base 
    after_create :associate_mongoid 

    def associate_mongoid 
    class_str = column_field.classify 
    klass = Object.const_set class_str, Class.new 
    puts "What is this #{klass} and its name #{klass.name}" # What is this SportsField and its name SportsField 
    c = klass.new 
    c['dynamic_field'] = 'abc' 
    c.save 
    end 
end 

항목이 성공적으로 내 mongoid의 DB에 저장됩니다, 그래서 나는이 방법이 완전히 실행 알고있다. 그러나 해당 상수는 해당 메서드 호출 외부에 존재하지 않습니다. 레일 콘솔을 실행합니다.

> SportsField 
NameError: uninitialized constant SportsField 

> ClassificationCode::SportsField 
NameError: uninitialized constant ClassificationCode::SportsField 

상수에는 어떤 변화가 있습니까? 더 이상 존재하지 않는 이유는 무엇입니까? 콘솔을 여러 번 리로드했지만 여전히이 상수는 존재하지 않습니다.

+0

이 도움이 될 수 있습니다 : http://stackoverflow.com/questions/3409931/why-can-you-not-declare-constants-in-methods-with-ruby – Brennan

+0

나는 Object.const_set 및 self.class .const_set, 내가 상수를 어디에 설정했는지에 관계없이, 단순히 메서드 호출 후에 존재하지 않습니다. – Donato

답변

0

이것은 범위 문제인 것처럼 보입니다. 메소드에서 상수를 정의한 다음 해당 메소드를 종료하십시오. 상수는 변수를 재 할당 할 수 없다는 것을 제외하고는 다른 모든 변수와 매우 비슷합니다. 메소드에서 정의한 경우 해당 메소드 외부에서 정의되지 않습니다. 나는 여기서 당신이 상수를 오용하고 있다고 생각합니다.

+0

Object.const_set은이 메서드의 로컬 변수가 아니라 객체 수준의 상수를 정의한다고 생각했습니다. – Donato

+0

내 이해가되지 않습니다 : [Ruby doc on const_set] (http://ruby-doc.org/core-2.1.0/Module.html#method-i-const_set). 'Object.const_set'는 객체 (모듈 일 수 있습니다)에서 정적 메소드'const_set'를 호출한다는 것을 의미합니다. 그러나 범위 나 다른 것을 전환하지는 않습니다. – LukeS

+0

이 기능을 전세계에 제공하는 방법에 대한 제안 사항이 있습니까? – Donato

관련 문제