Rails Stack Trace
Bài đăng này đã không được cập nhật trong 7 năm
1. Stack Trace là gì:
-
Trong quá trình lập trình Rails, thỉnh thoảng ta sẽ thấy những thông báo lỗi như thế này.

-
Thông báo lỗi đang hiển thị Stack Trace, bao gồm 3 phần
ApplicationTrace(được hiển thị mặc định),Framework TracevàFull Trace. -
Stack Trace là thứ tự chi tiết các function xãy ra lỗi được gọi, cho phép ta debug và fix lỗi.
2. Cách đọc của Stack Trace:
-
Trong nhiều trường hợp, Stack Trace được hiển thi khá dài, nhất là phần Framework Trace và Full Trace.
-
Tuy nhiên đọc Stack Trace là kĩ năng cần thiết giúp chúng ta tìm ra code đang chạy theo thứ tự nào, lỗi xảy ra ở đâu và tại sao.
-
Trong hình minh họa trên, màn hình đang hiển thị 1 đoạn Stack Trace ngắn, nhìn vào đó ta có thể biết được các thông tin sau
-
Nội dung lỗi:
When assigning attributes, you must pass a hash as an argument. -
Lỗi tại:
app/controllers/users_controller.rb:5:in show -
Code tại dòng lỗi:
@user = User.new(params[:id]) -
Ta thay thế function new bắng function find và chạy lại, kết quả thu được

3. Tác dụng Stack Trace:
-
Ta sẽ thử với 1 đoạn Stack Trace dài hơn để làm rõ hơn tác dụng của Stack Trace.
-
Ta thêm 2 function trong
application_helper.rbdef raise_error raise "Error" end def call_raise_error raise_error end -
Gọi function
call_raise_errortrong method show củaUsersControllervà chạy lại.def show call_raise_error @user = User.find(params[:id]) end -
Kết quả thu được

-
Lần này ta có 1 đoạn Stack Trace dài hơn và chi tiết hơn.
-
Các dòng trong Stack Trace được hiển thị từ dưới lên theo thứ tự chạy của các function được gọi.
-
Trong ví dụ, các funtion được gọi theo thứ tự
app/controllers/users_controller.rb:5:in showgọiapp/helpers/application_helper.rb:7:in call_raise_errorapp/helpers/application_helper.rb:7:in call_raise_errorgọiapp/helpers/application_helper.rb:3:in raise_error
-
Dòng trên cùng là dòng đang gây ra lỗi.
app/helpers/application_helper.rb:3:in raise_error
-
Trong nhiều trường hợp ta cần sữa lỗi theo thứ tự từ tên xuống dưới.
-
Click vào từng dòng có thể xem được chi tiết code lỗi tại dòng đó.
-
Lỗi tại dòng
app/controllers/users_controller.rb:5:in show
-
Lỗi tại dòng
app/helpers/application_helper.rb:7:incall_raise_error'`
-
Trong Rails Stack Trace chỉ được hiển thị khi xảy ra lỗi.
-
Để in ra Stack Trace trong cả trường hợp xảy ra lỗi và không xảy ra lỗi, ta sử dụng
puts caller -
Ví dụ khi mình sử dụng caller cho action show của UsersController
def show @user = User.find(params[:id]) puts caller end -
Kết quả thu được

4. Link source code:
All rights reserved