Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 8) - Các kỹ thuật trong Rails bạn nên biết(3)
Bài đăng này đã không được cập nhật trong 7 năm
Chào các bạn,
Hôm nay mình sẽ tiếp tục Series Hướng Dẫn Lập Trình Ruby on Rails (Phần 8) - Các kỹ thuật trong Rails bạn nên biết - 3 Ở phần này mình sẽ giới thiệu về các Ruby Gem mà mình đã làm qua, đã biết và mình nghĩ các bạn đang bắt đầu học về Ruby on Rails cũng nên biết về tụi nó vì có thể sau này sẽ hỗ trợ hoặc định hướng các cách làm trong các dự án thực tế :v
Trong bài này khi giới thiệu các gem mình đều có đính kèm phần Guideline hướng dẫn sử dụng gem ấy tương ứng để các bạn tiện theo dõi, các bài viết này đều là của các tác giả khác mà mình thấy hay nên trích dẫn,...rất cám ơn các tác giả của các bài viết hướng dẫn bên dưới ạ (lay4)
Gem Support
Gem hỗ trợ authentication sign_in/sign_up/logout/...
-
Devise: https://github.com/plataformatec/devise Nếu bạn muốn có một chức năng chức thực người dùng với các thao tác:
- sign_in/sign_up/logout,
- quản lý danh sách người dùng,
- các thao tác CRUD cơ bản
Thì
Devise
là một gem tuyệt vời giúp bạn thực hiện trên chỉ trong nháy mắt mà thôi =]]. Sự hiệu quả của nó được thể hiện qua hơn 28 triệu lượt download của các developer Ruby on Rails trên trang https://rubygems.org/ Đa số các dự án hiện tại ở công ty mình đều thấy đang sử dụng Gem này để thực hiện authentication phía màn hình quản lý :v Guideline: https://viblo.asia/p/gioi-thieu-gem-devise-amoG84YnGz8P -
Clearance: https://github.com/thoughtbot/clearance Thằng này cũng có chức năng tương tự, các bạn tham khảo thêm ở trang source của nó nhé. Guideline: https://viblo.asia/p/rails-authentication-voi-gem-clearance-p1PvQ5EBvldr
Gem hỗ trợ phân quyền user
Trong một hệ thống lớn có thể bạn muốn phân quyền cho từng User chỉ được thực hiện một số chức năng nhất định, truy cập vào một số trang nhất định thì những gem sau đây sẽ giúp các bạn thực hiện điều đấy.
- Cancancan: https://github.com/CanCanCommunity/cancancan Đây là gem được khá nhiều người sử dụng để thực hiện phân quyền trong ứng dụng của mình. Guideline: trang github của nó đã mô tả rất đầy đủ quá trình cài đặt và sử dụng, các bạn tham khảo nhé.
- role_authorization: https://github.com/asceth/role_authorization
Gem hỗ trợ mã hóa password
- bcrypt: https://github.com/codahale/bcrypt-ruby
Đây là gem giúp người dùng có thể dễ dàng mã hóa được password lưu xuống database để tránh trường hợp nếu một ngày đẹp trời Hacker tấn công hệ thống của bạn và đánh cắp mật khẩu của user, mật khẩu của user đôi khi có thể sử dụng cho nhiều tài khoản khác nhau: tk ngân hàng, tkợ thanh toán trực tuyến, atm,...
Nên việc mã hóa password của User là một bước giúp tăng security cho hệ thống của bạn (ngon)
Và do cơ chế mã hóa được
bcrypt
sử dụng là cơ chế mã hóa một chiều nên dù Hacker có lấy được đoạn hash password thì việc tìm ra password là điều khó có thể xảy ra :v Guideline: https://github.com/codahale/bcrypt-ruby#how-to-use-bcrypt-in-your-rails-application - scrypt: https://github.com/pbhogan/scrypt
Đây cũng là một gem giúp người dùng mã hóa password của user khi lưu xuống db.
Theo như tài liệu của nó thì nếu mất 5 giây để sinh ra 1 key nhằm tìm mật khẩu của bạn từ chuỗi hash thì chi phí để tổ chức một cuộc tấn công như thế vào
scrypt
sẽ gấp4000
lần so vớibcrypt
và gấp20000
lần so với việc sử dụng mã hóaPBKDF2
Con số khá là ấn tượng đấy, dự án sau chắc mình sẽ lưu ý dùng con này thay cho bcrypt xem sao
Gem hỗ trợ config các giá trị mặc định
-
config: https://github.com/railsconfig/config Đây là gem giúp các bạn dễ dàng quản lý các giá trị mặc định một cách dễ dàng sử dụng định dạng file YAML, ngoài ra còn giúp quản lý các giá trị này tùy thuộc theo từng môi trường: DEV, STAGING, PRODUCTION,... Guideline: trang chủ của nó đã trình bày khá rõ các bước install, các bạn vào đọc nhé.
-
mixlib-config: https://github.com/chef/mixlib-config Đây cũng là gem giúp quản lý giá trị mặc định trong project
Gem hỗ trợ phân trang
- kaminari: https://github.com/kaminari/kaminari Đây là gem giúp các bạn thực hiện phân trang các record trong Model một cách dễ dàng khi bạn muốn show list record trong Model ấy lên view. Guideline: trang chủ của nó đã viết hướng dẫn rất kỹ.
- will_paginate: https://github.com/mislav/will_paginate
will_paginate
là một gem có chức năng tương tự nhưkaminari
nó cũng được dùng để thực hiện phân trang, hai gem này đều đang dẫn đầu về số lượng được download sử dụng trên trang https://rubygems.org/. Tuy nhiên theo một số nhận định thìkaminari
do dễ dàng custom view hiển thị và install hơn nên đang được sử dụng nhỉnh hơn một chút.
Gem hỗ trợ tìm kiếm
- ransack: https://github.com/activerecord-hackery/ransack Đây là gem giúp các bạn thực hiện search theo các fields trong ActiveRecord, ngoài ra còn hỗ trợ search form đối với các ứng dụng có chức năng cho phép end-user search dữ liệu, hỗ trợ search thông qua ajax,...
- searchkick: https://github.com/ankane/searchkick
Đây là gem giúp các bạn thực hiện Elasticsearch đối với bất kì model nào mà các bạn muốn.
Ngoài ra nó còn hỗ trợ
- Getting Started
- Querying
- Indexing
- Instant Search / Autocomplete
- Aggregations
- Deployment
- Performance
- Elasticsearch DSL
- Reference Các bạn có thể tham khảo thêm ở trang github của nó nhé
Gem hỗ trợ viết API
-
doorkeeper: https://github.com/doorkeeper-gem/doorkeeper Đây là gem giúp các bạn thực hiện authenticate user thông qua token, quản lý token expire time,...cung cấp sẵn các API như:
- Create new token
- Refresh token
- Revoke token
Ngoài ra nó còn hỗ trợ phương thức chứng thực Oauth2, việc cấu hình và sử dụng gem này cũng không phức tạp lắm, và document của nó thì khá là dễ hiểu nên bạn nào có ý định xây dựng 1 ứng dụng API thì nên tham khảo nó.
Dự án của mình hiện tại cũng có xây dựng API cho phía mobile và mình đang sử dụng combo:
doorkeeper
+active_model_serializer
để viết API thấy rất hiệu quả và nhìn code rất clean. Bạn nào muốn viết API hãy cân nhắc sử dụng combo này xem thử :v Guideline: https://github.com/doorkeeper-gem/doorkeeper#installation
-
grape: https://github.com/ruby-grape/grape Đây cũng là một gem giúp xây dựng một ứng dụng RESTful API được khá là nhiều developer sử dụng (> 5 củ người download @@). Có thể nó còn rất nhiều tính năng hay ho bên trong mà mình chưa biết (vì chưa dùng lần nào) nhưng đọc qua cái docs của nó thì thấy hơi ngán vì cấu trúc file khá lằn nhằng, chắc bữa nào phải ngồi ngâm cứu lại nó xem (lol)
-
jwt: https://github.com/jwt/ruby-jwt Json Web Token là 1 tiêu chuẩn mở (RFC 7519) định nghĩa cách thức truyền tin an toàn giữa các thành viên bằng 1 đối tượng JSON. Nó được dùng để sinh ra chuỗi token theo một thuật toán nhất định, chuỗi token này được dùng để authenticate user. Một điều đặc biệt là khác với 2 gem trên token cần được lưu xuống database thì khi sử dụng
jwt
chúng ta không cần lưu lại token mà việc authenticate token sẽ dựa vào chuỗi SECRET trên server mà chúng ta định nghĩa. Cái này mình chỉ mới đọc qua chứ chưa làm thực sự nên các bạn tìm hiểu thêm nhé. Guideline: https://viblo.asia/p/jwt-authentication-trong-rails-ymwGXV40R4p1
Gem hỗ trợ Serializer
- active_model_serializer: https://github.com/rails-api/active_model_serializers Đúng như cái tên của nó gem này tạo nên các convention chung trong việc generate chuỗi JSON. Làm việc thông qua 2 components chính: serializers và adapters Serializers mô tả những attributes và relationships sẽ được serialized Adapters mô tả cách mà các attributes và relationships sẽ được serialized. Guideline: https://github.com/rails-api/active_model_serializers/blob/v0.10.6/docs/general/getting_started.md
Gem hỗ trợ chèn record hàng loạt (bulk inserting data)
- activerecord-import: https://github.com/zdennis/activerecord-import
Giả sử bạn có 1000 dòng data muốn lưu vào database, theo cách làm thông thường sẽ tạo 1 vòng loop rồi insert từng dòng vào database đúng không. Nếu như thế thì các bạn sẽ mất N query để insert dữ liệu vào database.
Với
activerecord-import
các bạn chỉ cần khởi tạo giá trị cho 1000 record ở trên và import chúng vào database chỉ với 1 câu sql duy nhất :v Gem này hỗ trợ rất tốt trong trường hợp các bạn cần insert số lượng record lớn.
Hôm nay chắc dừng ở đây thôi nhỉ, nếu có thời gian mình sẽ tiếp tục bổ sung thêm các gem support mà mình biết để giúp cho các bạn dễ dàng tiếp cận hơn và có nhiều sự lựa chọn khi thực hiện dự án :v
Bài này được viết dựa trên kinh nghiệm còn ít ỏi của bản thân nên có những chỗ nào thiếu sót và chưa đúng hoặc cần bổ sung thêm nhờ các bạn góp ý giúp mình ạ (lay4)
All rights reserved