Better Errors & RailsPanel
Bài đăng này đã không được cập nhật trong 8 năm
Học fix bug là điều cần làm tốt trước khi học code, và để fix được bug thì bạn cần phải hiểu được những errors messages. Tuy nhiên, nhiều lúc những errors messages của hệ thống thật là kì cục, khó hiểu hoặc là làm cho bạn thật khó để tìm được đoạn code bị lỗi, phần xử lý bị sai, điều đó làm cho công việc fix bug của bạn khó khăn hơn. Hôm nay, tôi muốn giới thiệu đến các bạn công cụ giúp bạn nhẹ nhàng hơn khi phát triển dự án.
Trước tiên, bạn hãy xem ví dụ dưới đây, trang index vẫn hoạt động, nhưng khi click đến trang show, sẽ có lỗi
Chúng ta có thể thấy chưa định nghĩa empty?
khi gọi đến một class nil
và có lỗi xảy ra khi ta tạo một checkbox
như trong ví dụ trên. Tuy nhiên, ở đây không chỉ rõ ràng đoạn code gọi đến empty?
, và có vẻ như exception page này sẽ được cải thiện khi được mô tả rõ hơn khi hiển thị error message.
Sử dụng Better Error
Khi sử dụng Better Error ta sẽ nhận được đoạn message error trông rõ ràng hơn
có thể xem chính xác được đoạn code gây nên lỗi.
Để sử dụng Better Error bạn thực hiện cài thông qua Gemfile
group :development do
gem 'better_errors'
end
sau đó chạy bundle
. restart lại server và load lại trang vừa rồi.
DÒng code báo lỗi sẽ được highlight và bạn có thể phát hiện ra empty?
đã được dùng lỗi ở đâu.
Một tác dụng nữa là giúp chúng ta hiểu hơn việc vận hành của Rails. Từ đoạn lỗi của chúng ta, chúng ta có thể nhận thấy method check_box
được trigger từ đoạn code nào, và chạy qua các stack trace, chúng ta nhìn thấy method được gọi ở form builder, chúng ta có thể thực hiện lần lượt các bước xử lý, và hiểu hơn về những gì Rails thực hiện.
Ở cuối trang báo lỗi, bạn có thể nhìn thấy thông tin về request bao gồm các tham số và các cookies mà bạn đã sử dụng, mặc dù đây không phải là tất cả mà gem này có thể làm. Chúng ta có thể thêm gem binding_of_caller
để có thể thực hiện nhiều chức năng hơn hiển thị trong thông báo lỗi.
Để thử tính năng của Gem này, trước hết ta cài qua Gemfile
group :development do
gem 'better_errors'
gem 'binding_of_caller'
end
Chạy bundle
, restart server và load lại page, bạn sẽ nhận được nhiều thông tin hơn từ error message.
Gem hoạt động và báo nhiều dòng lỗi, có thể nhìn thấy nhiều giá trị biến instance.. trong trường hợp ở Task model trong ví dụ của chúng ta, gem hoạt động đã chỉ ra completed_at
is nil
, đó là lý do tại sao sẽ raise lỗi khi gọi đến method empty?
.
Ở đây, thay vì dùng empty?
, chúng ta nên dùng present?
vừa đảm bảo được hạn chế dùng phủ định !
và cũng fix được lỗi này, các bạn có thể xem thêm về method empty?
và present?
của rails
Sử dụng Better Errors với AJAX Requests
Trong trường hợp hệ thống của chúng ta gặp một số bug khác, nếu chúng ta đánh dấu một task là complete bằng cách tick vào checkbox mà form tạo ra, và tự động move vào "Completed Tasks" và update vào database, chúng ta cần dùng tới AJAX request.
Khi chạy task không được move và lưu vào database, nếu ta thấy sẽ raise exception trong khi AJAX request. Chúng ta có thể thấy được raise lỗi tốt hơn khi đi đến đường dẫn của Better Error: __better_errors
. Dưới đây là hình minh họa
Điều nay cho chúng ta thấy ngoại lệ cuối cùng xảy ra và nó giống với trong development log. Chúng ta có thể dùng console để lấy được giá trị của biến value
, đó là 1 string có giá trị là "1". điều đó giải thích tại sao lại có ngoại lệ khi gọi zero?
. Ở đây là giá trị string, nên chúng ta cần phải convert string thành integer.
Trước khi kết thúc vấn đề về Better Errors, tôi sẽ đề cập đến vài vấn đề khi mở trình soạn thảo code. Hoạt động của các gem bên trong cũng như vậy nếu chúng ta muốn biết tại sao, assign_attributes
hoạt động bên trong Active Record chúng ta có thể click vào link giống như vào code của chúng ta. Nếu chúng ta muốn thay đổi IDE (trình soạn thảo) mả Better Errors sử dụng, chúng ta có thể tạo ở một file ở initializers
và settings Better Errors.
/config/initializers/better_errors.rb
BetterErrors.editor = :sublime if defined? BetterErrors
Chúng ta đã định nghĩa mở Better Errors bằng Sublime Text.
Rails Panel
group :development do
gem 'better_errors'
gem 'binding_of_caller'
gem 'meta_request'
end
Tài liệu tham khảo
All rights reserved