2017-12-24 37 views
1

레일즈에 익숙하지 않은 것처럼 보였습니다. 모델을 변경할 때마다 콘솔에서 reload!을해야한다고 들었습니다.Ruby on Rails - 모델을 다시로드해야 할 때 불일치가 있습니까?

이 두 가지 시나리오보다 먼저 reload!이라고 가정 해 봅시다.

의 내가 같은 특정 구문 오류가있는 모델로, 대본을 가지고 있다고 가정 해 봅시다 :

class Article < ActiveRecord::Base 
    validator :title, presence: true 
end 

실행 Article.new(title: "Test 1")이하는 NoMethodError을로는 이해할 것이다 발생합니다. 그러나 내가 들어가서 오류를 수정하면 reload!을 실행하지 않아도 Article.new(title: "Test 1")이 실행됩니다.

시나리오 B, 반대 방향으로 진행. 예상대로

class Article < ActiveRecord::Base 
    validates :title, presence: true 
end 

Article.new(title: "Test 1")를 실행하면, 오류없이 작동합니다 : I는 다음과 같은 올바른 구문으로 모델을 가지고있다. 하지만 그때 들어가서 validatesvalidator으로 변경하면됩니다. reload!을 실행하지 않으면 article.rb 파일에 구문 오류가 있어도 Article.new(title: "Test 1")을 실행해도 계속 작동합니다. 을 실행하여 명시 적으로 지금은 NoMethodError이 될 때까지는 아닙니다.

정확히 무엇이 여기에 있습니까? 나는 그것이 매우 구체적이라는 것을 안다. 그러나 이것이 왜 그런지는 알지 못한다. 시나리오 B와 같이 모델을 업데이트하기 위해 reload!을 실행해야하는 경우가 종종 있는데, 때로는 시나리오 A와 같이 그렇지 않습니다.

답변

1

첫 번째 예에서는 레일스가 오류를 발생 시켜서 클래스를로드하지 못했습니다. 오류를 수정 한 후에 클래스가 성공적으로로드되지 않았기 때문에 클래스를 다시로드 할 필요가 없습니다.

두 번째 예에서는 클래스가 성공적으로로드되었습니다. 따라서 레일스에 클래스를 메모리에 다시로드하라고 알리려면 reload!으로 전화해야합니다.

+0

아! 고맙습니다! 그래서 그것은 처음에 성공하지 못하면 기본적으로 자동으로 다음 실행시 자동으로 다시로드됩니까? – rb612

+1

@ rb612 예. 개발 모드에서 Rails는 기본적으로 모든 상수를로드하지 않습니다. 어디서나 참조 될 때 필요할 때로드합니다. 그래서'Article'을 만나면이 상수가 메모리에로드되었는지를 검사하고, 그렇지 않으면'$ LOAD_PATH'에있는 파일의 존재를 검사합니다. 발견되면로드하려고 시도하고 상수를 생성합니다 '조항'을 작성해야합니다. 첫 번째 경우에는 후자 부분이 실패했기 때문에'Article' 상수가 생성되지 않았으므로 코드를 수정하고'Article.first'를 다시 실행하면 업데이트 된 코드로 클래스를 올바르게로드합니다. – kiddorails