2012-06-27 25 views
15

Tôi chỉ đang bị treo bảng điều khiển Rails và thấy nó hữu ích để nhanh chóng thử nghiệm các phương thức trong các lớp học của tôi. Tôi biết rằng tôi có thể thực hiện các thay đổi đối với Mô hình của mình, sau đóLý do "tải lại!" không phải lúc nào cũng hoạt động trong giao diện điều khiển Rails?

> reload! 

để lấy các bản cập nhật đó, nhưng đôi khi tôi thấy rằng nó dường như không tải lại mã mới nhất của tôi. Có Rails cache code ở đâu đó?

Trong một ví dụ giả thực sự đơn giản, tôi có thể có mã xấu trên đường dây 100:

100: u = User.alll 

và trong Rails giao diện điều khiển, khi tôi chạy phương pháp này, tôi có thể nhận được một lỗi tương tự như:

NoMethodError: undefined method `alll' for User:Class ... on line 100 

sau đó sửa đổi mã của tôi, sửa chữa các lỗi

100: u = User.all 

sau đó tải lại:

> reload! 

và sau đó, khi gọi phương thức trong lớp này có mã đúng, nó vẫn sẽ nói

NoMethodError: undefined method `alll' for User:Class ... on line 100 

Khi rõ ràng, lỗi là cố định, và dòng vi phạm thậm chí không trên dòng 100 nữa. Có cách nào để buộc/cứng đặt lại "tải lại!" chỉ huy?

Trả lời

22

Tôi đoán sẽ là bạn đang làm một cái gì đó như:

  1. Tạo một thể hiện của User
  2. Gọi someMethod trên dụ
  3. Bạn nhận được một lỗi, và bạn đi và sửa chữa nó
  4. reload!
  5. Bạn gọi someMethodtrên phiên bản hiện tại và nhận lại lỗi

Vì vậy, bạn đang gọi phương thức trên một cá thể chưa được tải lại. Lớp của nó đã được nạp lại, nhưng bản thể hiện đã có trong bộ nhớ - với các lỗi và tất cả.

Đó sẽ là dự đoán của tôi ít nhất (không chắc chắn 100%).

Điểm là, nếu bạn tạo một phiên bản mới sau số reload! và gọi phương thức của bạn trên phiên bản mới đó, nó sẽ ngừng khiếu nại.

+0

Có điều này chính xác là vấn đề. Các trường hợp bạn tạo không "tải lại". Sau khi tải lại! -ing và tái instantiating, mọi thứ làm việc tuyệt vời mỗi lần. Cảm ơn @flambino – jbnunn

Các vấn đề liên quan