2012-05-05 3 views
6
> rvm list 
rvm rubies 

=* ruby-1.9.2-p290 [ i686 ] 
    ruby-1.9.3-p194 [ i686 ] 

> rails -v 
Rails 3.1.1 

관련,하지만 대답하지 않았다 : Is there a Rails Console command (Rails 3+) to reload changed code? 나는 시도하고 내 모델의 메소드가 호출되지 않는 이유를 알아 내기 위해 레일을 콘솔을 사용하고레일즈 콘솔에서 모델을 어떻게 다시로드합니까?

. 모델은 ./app/models/product.rb에 있습니다. 방법을 self.trim_history에서 trim_history으로 변경하고 있습니다. 나는 여전히 self.do_stuff 또는 단지 do_stuff과 같은 메소드를 호출 할 때 내 머리를 감싸고있다.

글쎄 이것을 알아내는 과정에서 나는 reload!으로 문제를 겪었습니다. 내 이해는 reload! 모든 모델과 컨트롤러를 다시로드 할 것이라고했지만 작동하지 않는 것 같습니다. 코드를 디버깅 할 때 do_stuff으로 변경된 줄은 여전히 ​​디버거에 self.do_stuff으로 표시됩니다.

나는이 문제를 해결하기 위해 reload!으로 해결하려고했습니다. 다시로드 한 후에 데이터베이스에서 객체를 다시로드했습니다. load './app/models/product.rb'으로 직접 모델을로드 한 다음 데이터베이스에서 오브젝트를로드했지만 수정하지 않았습니다. 개체가 tail으로 변경되고 있음을 확인했습니다.

레일 콘솔에서 모델을 다시로드하는 가장 좋은 방법은 무엇입니까? 모델 코드가 변경 될 때마다 콘솔을 다시 시작해야합니까? 콘솔을 다시로드하지 않고 모든 기존 모델과 해당 코드를 덤프 할 수있는 방법이 있습니까?

:이 사람은 낯선 사람입니다. 이제 내 코드가 다시로드되는 것 같지만 디버거는 새 코드를 반영하지 않습니다. 코드를 단계별로 실행하면 이전 코드가 있지만 새 코드가 실행됩니다. 나는 raise을 추가하여이를 테스트했다. raise은 디버거에 표시되지 않지만 발생한다. 와트?

재로드 된 코드를 보려면 디버거와 관련이 있습니까? 이것은 버그처럼 보입니다 ...

+1

클래스 자체 또는 클래스 인스턴스에서 메서드를 호출하려고합니까? –

+0

@ChrisSchmitz 클래스의 인스턴스; 나는 그것을 이해할 때까지 자기를 사용하고 코드를 어지럽히는 것에 대해 읽고있다. – jcollum

+0

Ruby에는 여러 가지 디버거가 있지만 사용중인 디버거를 지정하는 것이 좋습니다. –

답변

16

reload! 기존 객체를 다시 초기화하지 않으면 코드가 다시로드됩니다. 클래스의 새 인스턴스를 만드는 경우 변경 내용을 반영해야합니다.

+0

이것은 OP, 아마도 내가 생각하는 방식으로 물건을 만들지 않을거야? db :'p = Product.by_name 'Acme Mop''에서'Product.where (name : name) .first'를 호출하여 문제를 일으킬 수 있습니까? – jcollum

+0

@jcollum 그는 어떻게 * 만들어 졌는지는 관련이 없지만 오히려 * 때라고 말하고 있지 않습니다. 'reload! '를 호출하기 전이나 후에 객체를 만들고 있습니까? –

+0

@AndrewMarshall, OP에서 다룹니다. 'reload! '를 호출 한 후 db에서 객체를로드하고 코드 변경 사항이 객체에 반영되지 않았습니다. – jcollum

관련 문제