Ruby on Rails là một framework phổ biến được xây dựng bằng NNLT Ruby, hẳn các bạn cũng từng nghe qua hoặc đã sử dụng nó. Rails được xây dựng dựa trên nguyên tắc Convention over configuration. Theo đó, Rails rất dễ sử dụng, tuy nhiên cũng rất dễ trong việc sử dụng sai. Bài viết hôm nay mình sẽ chia sẽ một số sai lầm những người bắt đầu với Rails thường mắc phải (trong đó có mình), cũng như làm thế nào để tránh những sai lầm mắc phải này.
1. Đặt quá nhiều logic trong Controller
Rails được xây dựng trên mô hình MVC. Chúng ta cũng được nghe khá nhiều về Fat model, thin controller. Bắt đầu với Rails, bạn sẽ cảm thấy việc đặt những logic vào controller khá là dễ dàng, ví dụ những logic trong helper, hay thậm chí là những câu query đáng lẽ ra nó phải nằm ở model. Lúc này controller của bạn đã vi phạm nguyên tắc mỗi controller chỉ nên làm 1 việc đúng nhiệm vụ của nó, làm cho việc sửa code hoặc maintain trong tương lai sẽ trở nên khó khăn.
Thông thường, controller của bạn chỉ nên xử lý những việc sau:
- Xử lý về session và cookie, cũng như authentication, authorization
- Tìm kiếm đúng những dữ liệu cần thiết cho model trả về view
- quản lý các request parameter
- Render/Redirect kết quả
2. Đặt quá nhiều logic trong view
Rails ERB là một cách tuyệt vời để xây dựng các trang web với nội dung động. Tuy nhiên hãy thận trọng nếu bạn nhúng quá nhiều code Ruby vào HTML, để rồi đến một ngày khi nhìn lại bạn không còn nhận ra mình đang làm cái gì nữa. Hãy tránh sử dụng logic trong view, hãy đưa vào helper, code của bạn sẽ nhìn sáng sủa hơn, và còn có thể dùng lại ở đâu đó trên một trang view khác nữa. Ví dụ đơn giản
Thay vì sử dụng logic trong view như thế này
<h1> Welcome <% if user_signed_in? %> <%= current_user.name %> <% else %> Guest <% end %> </h1>
Bạn hoàn toàn có thể đưa nó vào helper
def current_user_name user_signed_in? ? current_user.name : "Guess" end <h1>Welcome <%= current_user_name %></h1>
- Hãy sử dụng các layout hoặc partial để đóng gói những thứ lặp lại trên view của bạn
- Sử dụng present/decorator để xử lý các logic rồi đưa ra kết quả cuối cùng cho view
3. Đặt quá nhiều logic trong model
Có vẻ mâu thuẩn nhỉ, ở mục 1 chúng ta có nói Fat model, thin controller, vậy thì đặt logic nhiều vào model có gì sai? Không có gì sai, tuy nhiên model của bạn sẽ càng ngày càng phình to, rồi đến một lúc bạn sẽ cảm thấy mệt mỏi khi đọc lại những cái file đó. Giải quyết vấn đề này, hãy áp dụng các design pattern như: Service Object, Query Object, Form Object, ... file model của bạn sẽ trở nên nhẹ nhàng hơn, và thật thoải mái khi làm việc với chúng
4. Sử dụng quá nhiều gem
Ruby và Rails cung cấp cho chúng ta một hệ sinh thái Gem phong phú với bất cứ một chức năng nào mà các developer có thể nghĩ đến. Với gem file bạn có thể xây dựng những chức năng đơn giản một cách dễ dàng với những dòng code đơn giản. Tuy nhiên, hãy cân nhắc khi dùng gem.
- Dùng càng nhiều gem hệ thống của bạn sẽ load càng nhiều code và tất nhiên performance sẽ bị ảnh hưởng.
- Dùng nhiều gem bạn sẽ không control được code của mình nó đang làm cái gì
Dùng gem đúng mục đích và đừng quá lạm dụng nó.
5. Bỏ qua log file
Chắc hẳn ai cũng biết được mặc định những file log sẽ được tự động sinh ra và ghi lại những hoạt động của ứng dụng trong quá trình phát triển trên localhost, cũng như sản phầm đã đưa đến tay người dùng. Tuy nhiên, hẳn là cũng không ít người ngó ngàng đến những dòng log vô vị này, họ chỉ cần thấy ứng dụng chạy là vui lắm rồi. Hãy luôn tạo thói quen xem log khi chạy ứng dụng, điều này rất là quan trọng. Bạn sẽ thấy ngay những lỗi nhìn được trước khi sản phẩm đưa đến tay người dùng. Ví dụ phổ biến nhất có lẽ là N+1 query
# users_controller users = User.all # users/index.html users.all.each do |user| # show something user.news.count end
Khi thực thi để show thông tin ở trang view, bạn sẽ thấy đầy đủ việc query ở trong log
SELECT `users`.* FROM `users`SELECT `users`.* FROM `users` SELECT COUNT(*) FROM `news` WHERE `news`.`user_id` = 1 SELECT COUNT(*) FROM `news` WHERE `news`.`user_id` = 2 SELECT COUNT(*) FROM `news` WHERE `news`.`user_id` = 3 SELECT COUNT(*) FROM `news` WHERE `news`.`user_id` = 4 .....
Bạn nhận thức được tác hại của N+1 query, nhưng vô tình code không để ý. Lúc này với thói quen nhìn file log mỗi lần thực thi sẽ giúp bạn fix được những lỗi có thể nhìn thấy.
6. Bỏ qua unit test
Vấn đề này có lẽ đã được bàn luận quá nhiều. Unit test là gì? Tại sao phải viết unit test? Viết unit test thế nào cho đúng? Các bạn có thể đọc bất cứ bài viết nào, hẳn nội dung cũng tương tự nhau thôi