12/08/2018, 14:33

Một số mẹo khi sử dụng Rails Console trong Ubuntu

Với lập trình viên Ruby on Rails, Rails console là công cụ không thể thiếu khi phát triển sản phẩm. Console giúp bạn tương tác với ứng dụng Rails, đặc biệt là các model, trong môi trường thời gian thực thay vì phải load lại trang web. Tôi sẽ ghi lại một vài thủ thuật thú vị với công cụ này, hi vọng ...

Với lập trình viên Ruby on Rails, Rails console là công cụ không thể thiếu khi phát triển sản phẩm. Console giúp bạn tương tác với ứng dụng Rails, đặc biệt là các model, trong môi trường thời gian thực thay vì phải load lại trang web. Tôi sẽ ghi lại một vài thủ thuật thú vị với công cụ này, hi vọng có thể giúp bạn tìm thấy niềm vui và gia tăng năng suất trong quá trình làm việc.

Xóa màn hình Console

Khi bật rails console, chỉ với vài câu lệnh, màn hình của bạn nhanh chóng bị lấp đầy, ví dụ như hình dưới đây: Lúc đó, tổ hợp phím Ctrl + L sẽ giúp bạn xóa màn hình, gọn gàng và sạch sẽ để bắt đầu một câu lệnh mới.

Tải lại Console

Thông thường trong quá trình viết ứng dụng, chúng ta tạo ra một vài thay đổi trong trình soạn thảo code rồi chuyển sang trình duyệt, bấm nút tải lại trang để xem những thay đổi ấy như thế nào. Điều này xảy ra bởi vì mã lệnh ứng dụng của bạn tự động load lại khi có request gửi đến ở môi trường development.

Theo mặc định, Rails console cũng được thực thi ở môi trường development, nhưng không tự động tải lại code. Khi đó, chúng ta có thể refresh code bằng cách thoát ra khỏi console (với lệnh exit hoặc bấm tổ hợp phím Ctrl + D) và bắt đầu phiên làm việc mới bằng lệnh rails c. Nhưng đó là cách làm tẻ nhạt và tốn nhiều thao tác mỗi khi code của bạn có sự thay đổi.

Thủ thuật ở đây là sử dụng lệnh reload! để nhanh chóng update phiên bản mới nhất của code, khi đó màn hình console sẽ thông báo tải lại code thành công:

>> reload!
Reloading...
=> true

Tuy nhiên có một lưu ý rằng, mọi đối tượng tồn tại ở phiên làm việc trước đó vẫn giữ nguyên trạng thái của chúng. Ví dụ, nếu bạn khởi tạo một đối tượng movie trong Rails console, sau đó trong trình soạn thảo code bạn bổ sung 1 phương thức mới vào model Movie thì đối tượng movie ấy sẽ không nhận phương thức đó ngay cả khi bạn gõ lệnh reload!. Cách giải quyết là bạn cần khởi tạo lại đối tượng.

Tìm lại câu lệnh đã thực thi

Môi trường console sẽ lưu lại lịch sử những câu lệnh mà bạn đã thực thi và chúng ta có thể gọi lại những lệnh ấy bằng các phím mũi tên lên và xuống. Có một cách nhanh hơn ấy là dùng tổ hợp phím Ctrl + R và gõ vào chỉ vài ký tự của câu lệnh trước đó. Console sẽ tìm kiếm trong lịch sử và tự động gọi ra lệnh khớp với những ký tự bạn nhập vào. Khi nào bạn tìm được câu lệnh như mong đợi, chỉ cần ấn phím enter để thực thi. Nếu như muốn chỉnh sửa lại lệnh ấy, bạn có thể bấm những phím mũi tên để di chuyển đến vị trí cần chỉnh sửa.

Lấy ra giá trị của biểu thức vừa thực hiện

Đây thực sự là một thủ thuật rất hữu ích! Tình huống quen thuộc là, bạn gõ một lệnh vào Rails console, ví dụ như:

>> Movie.where("total_gross >= ?", 100000000).order(:title)

Rồi ngay lập tức bạn ấn phím enter để thực thi. Sau đó bạn nhớ ra bạn muốn làm gì đó với kết quả, nhưng trước đó bạn lại quên chưa gán nó vào biến. Thường thì chúng ta hay ấn phim mũi tên lên để gọi lại dòng code và chỉnh sửa nó. Cách hay hơn ở đây là trong Rails console, giá trị của câu lệnh mới nhất sẽ được tự động lưu vào biến _. Để gán giá trị câu lệnh vừa thực thi vào biến movie chẳng hạn, bạn có thể viết:

>> movies = _

Khi đó chúng ta có thể thao tác với kết quả như bình thường, chẳng hạn bạn thực hiện lệnh:

>> movies.size
=> 5

Hoặc nhanh hơn, bạn có thể gọi đến phương thức size trực tiếp với biến _:

>> _.size
=> 5

Thật là tuyệt!

Làm việc với các helper

Nếu bạn muốn thử nghiệm một helper trước khi nhúng nó vào view thì sao? Cách làm là sử dụng biến helper, chúng ta có thể xem trực tiếp kết qủa trong Rails console, ví dụ:

>> helper.pluralize(3, 'mouse')
=> "3 mice"

>> helper.number_to_currency(1.50)
=> "$1.50"

>> helper.truncate("Iron Man", length: 7)
=> "Iron..."

Những ví dụ ở trên đều là các helper mà Rails hỗ trợ sẵn. Thế còn với các helper mà bạn tự định nghĩa ra thì sao? Thật tiện lợi là bạn cũng có thể chạy thử các helper ấy với cách như trên. Chẳng hạn bạn định nghĩa 2 helper trong project của mình là title_tag và poster_image_for. Khi ấy chúng ta có thể kiểm tra sự hoạt động các helper này trước khi nhúng vào trình soạn thảo code:

>> helper.title_tag(Movie.first)
=> "<title>Flix - Iron Man</title>"

>> helper.poster_image_for(Movie.first)
=> "<img alt="Ironman" src="/assets/ironman.png" />"

Việc chạy trực tiếp các helper như này sẽ giúp bạn tránh khỏi phiền toán với vòng lặp quen thuộc: chỉnh sửa code - load lại trang web - chỉnh sửa code - ...

Thiết lập đối tượng mặc định

Tiếp tục là một thủ thuật thú vị nhưng có lẽ bạn sẽ không thường xuyên sử dụng nó. Giả sử bạn đang làm việc với một đối tượng movie và gọi đến các phương thức của nó:

>> movie = Movie.first

>> movie.title
=> "Iron Man"
>> movie.rating
=> "PG-13"
>> movie.director
=> "Jon Favreau"

Nếu bạn dự định sẽ thực hiện nhiều thao tác khác xoay quanh đối tượng này, quả thật chúng ta nên tìm cách nào đó để tránh việc gõ movie. mỗi lần gọi đến nó. Để thực hiện điều này, bạn có thể đặt movie làm đối tượng mặc định với lệnh:

>> irb movie

Bây giờ mỗi khi bạn gọi đến một phương thức, nó sẽ được đặt trong ngữ cảnh của đối tượng movie:

>> title
=> "Iron Man"
>> rating
=> "PG-13"
>> director
=> "Jon Favreau"

Để thoát khỏi phiên làm việc với đối tượng mặc định này và quay lại ngữ cảnh ban đầu, bạn có thể gõ lệnh exit hoặc sử dụng tổ hợp phím Ctrl + D:

>> exit
=> #<IRB::Irb:  . . .>

Xem mã nguồn

Trong quá trình làm việc với Rails console, bạn có thể muốn xem những phương thức đang sử dụng được cài đặt ở đâu hoặc cụ thể hơn là nó được cài đặt như thế nào. Ví dụ, bạn có model Movie định nghĩa một phương thức là average_stars. Trong Rails console bạn có thể chạy các lệnh:

>> movie = Movie.first
>> movie.average_stars

Bạn có thể tự hỏi rằng phương thức average_stars được định nghĩa ở đâu và như thế nào. Thật tuyệt là Ruby có thể giúp bạn giải quyết vấn đề nhanh gọn với câu lệnh:

>> location = Movie.instance_method(:average_stars).source_location
=> ["/Users/mike/flix/app/models/movie.rb", 39]

Kết quả trả về gồm 2 phần, tên file định nghĩa phương thức (movie.rb) và vị trí dòng trong file (39) mà phương thức ấy được định nghĩa. Nếu bạn sử dụng trình soạn thảo code Sublime Text, bạn có thể chạy lệnh sau để mở trực tiếp file đó ra:

>> `subl #{location[0]}:#{location[1]}`

Kết quả nhận được sau khi thực hiện câu lệnh này có thể khiến bạn cảm thấy thật ấn tượng, hãy thử xem sao nhé!

Tóm lại, có thể nói rằng, môi trường console là một trong những điều khiến cho Rails trở nên thú vị và tuyệt vời!

*** Nguồn tham khảo: https://pragmaticstudio.com/blog/2014/3/11/console-shortcuts-tips-tricks https://pragmaticstudio.com/blog/2013/2/13/view-source-ruby-methods http://slash7.com/2006/12/21/secrets-of-the-rails-console-ninjas/

0