Top các gem hữu ích và phổ biến trong Ruby (phần 2)

Link phần 1: https://viblo.asia/p/top-cac-gem-huu-ich-va-pho-bien-trong-ruby-phan-1-Qpmle2y95rd

Upload file

Thỉnh thoảng, chúng ta cần xây dựng một website cho phép người dùng tải lên các tệp đính kèm, như là tài liệu hay ảnh. Để đảm bảo tính năng này dễ sử dụng và thân thiện với người dùng hết sức có thể, chúng ta có thể sử dụng một vài thư viện sau.

  • Carrierwave là giải pháp đơn giản và cực kì linh hoạt để upload file cho Rails, Sinatra và các framework khác của Ruby. Nó cung cấp cho bạn store để lưu trữ vĩnh viễn, cache để lưu trữ tạm thời, bạn có thể sử dụng nhiều store khác nhau, cả lưu trong máy và trên cloud. Nếu mà bạn muốn quản lý nhiều version của ảnh, như kiểu ảnh gốc và ảnh thumbnail thì gem này cũng hỗ trợ, tuy nhiên phải cài thêm Imagemagick và MiniMagick để resize ảnh. Ngoài ra, Carrierwave làm việc với AWS S3, vì vậy nó rất phù hợp dùng với gem Fog, giúp tích hợp nhiều cloud server, bao gồm cả Rackspace Server và Brightbox.
  • CarrierWave Backgrounder dùng với Carrierwave. Nó cho phép dời cái quá trình xử lý và nén ảnh thành một tiến trình chạy ngầm. Hiện tại, nó hỗ trợ cho Delayed Job, Resque, Sidekiq, SuckerPunch, Girl Friday, Qu, và Queue Classic.
  • MiniMagick vừa được nhắc đến ở trên, dùng để resize, xoay, đổi format ảnh,... như một sự thay thế nhỏ gọn hơn cho RMagick. Nó cho giúp giảm dung lượng bộ nhớ để xử lý. Nó cho phép bạn truy cập vào tất cả các tùy chọn dòng lệnh ImageMagick có. Cách hoạt động của nó sẽ là tạo một bản sao từ ảnh chúng ta truyền vào, sửa nó và lưu lại thành 1 file mới, mà ko ảnh hưởng đến bản gốc.

Search

Trong một vài project, khi lượng thông tin trở nên quá lớn, việc tìm kiếm dữ liệu sẽ trở nên khó khăn hơn. Để việc tìm kiếm với các options trở nên thân thiện hơn, chúng ta có thể sử dụng gem sau:

  • Elasticsearch là hệ thống tìm kiếm được sử dụng rộng rãi trong các doanh nghiệp. Gem này tích hợp ElasticSearch vào ứng dụng Rails với đầy đủ tính năng, bao gồm cả full-text search. Cụ thể thì cũng có nhiều bài giải thích và hướng dẫn sử dụng ElasticSearch rồi nên mình sẽ ko nói nữa, mọi người có thể tự google để tìm hiểu.

Admin panels

Xây dựng một trang web lớn thường phải quản lý một lượng lớn dữ liệu. Các tiện ích sau đây sẽ giúp chúng ta quản trị cơ sở dữ liệu toàn diện hơn.

  • Activeadmin: Plugin này giúp bạn dễ dàng tạo ra các giao diện trang admin đẹp mắt và tùy chỉnh nó

  • Administrate: tương tự như Activeadmin, nhưng đơn giản hơn, chỉ để quản lý dữ liệu, thêm, sửa, xóa

Một số gem khác

Bonus thêm một số gem mà bạn có thể thấy thú vị, theo trình tự phổ biến trên github

  • Sidekiq là một công cụ đơn giản và hiệu quả của Ruby để chạy các luồng xử lý ngầm. Nó áp dụng các luồng để xử lý nhiều công việc cùng một lúc trong một quy trình. Tuy Sidekiq không bắt buộc dùng với Rails, nhưng khi kết hợp với Rails thì việc xử lý trở nên đơn giản hơn bao giờ hết. Sidekiq còn tương thích với Resque, nó có định dạng message giống nhau, nên có thể tích hợp sử dụng cả 2 cùng lúc.
  • Simple_form như tên gọi, giúp cho việc tạo form trong Ruby dễ dàng hơn mà không làm ảnh hưởng đến bố cục. Ví dụ như tạo một form đăng nhập:

  • Friendly_Id là một công cụ tuyệt vời để giúp URL trở nên thân thiện hơn, cụ thể là nó sẽ thay thế con số id vô nghĩa thành một chuỗi kí tự có nghĩa nào đó, như kiểu
# without FriendlyId
http://example.com/states/4323454

# with FriendlyId
http://example.com/states/washington

cách dùng thì cũng rất là đơn giản, ví dụ muốn thay id thành tên của user, thì trong model thêm dòng:

class User < ApplicationRecord
  extend FriendlyId
  friendly_id :name, use: :slugged
end

sau đó trong controller, khi muốn tìm user đó, thì thay vì dùng User.find(id) ta dùng User.friendly.find(id) thì URL của nó sẽ thành http://localhost:3000/users/name. Kể cả khi tìm kiếm, thay vì truyền id vào, ta cũng có thể truyền name vào: User.friendly.find("name").

  • Dotenv-rails là gem dùng để load các biến môi trường từ file .env có thể nằm bên ngoài thư mục dự án, bằng cách này, chúng ta có thể thay đổi thông tin giữa các môi trường deploy và giữ được những thông tin cần đảm bảo bí mật như key để đăng nhập với service bên ngoài.
  • Slim là một template về ngôn ngữ, giúp giảm thiểu các cú pháp không quá cần thiết mà vẫn không khiến code trở nên khó hiểu. Dễ thấy nhất là nó sẽ bỏ đi các thẻ đóng, thêm các cú pháp viết tắt, như kiểu thay vì viết <div id="a"> thì chỉ cần viết #a, ngoài ra còn có thêm nhiều cái hay ho nữa, mọi người đọc gem để biết thêm nhé. Có thể lúc đầu sẽ hơi khó dùng 1 chút, nhưng đến lúc dùng quen rồi thì thích kinh khủng luôn, nhanh hơn viết code HTML thuần rất nhiều.
  • Redis là thư viện mã nguồn mở Ruby-client. Để hiểu hơn về Redis thì mình thấy bài này viết khá chi tiết, mọi người có thể đọc thêm để hiểu: https://viblo.asia/p/gioi-thieu-ve-redis-su-dung-rails-model-caching-voi-redis-RQqKLYvzZ7z
  • Annotate đơn giản hóa công việc với các model của Rails. Nó sẽ thêm 1 đoạn comment về các thuộc tính của bảng của model đó. Kiểu như:
# == Schema Info
#
# Table name: line_items
#
#  id                  :integer(11)    not null, primary key
#  quantity            :integer(11)    not null
#  product_id          :integer(11)    not null
#  unit_price          :float
#  order_id            :integer(11)
#

 class LineItem < ActiveRecord::Base
   belongs_to :product
  . . .

Tính năng này sẽ giúp code đơn giản hơn, vì khi có quá nhiều bảng và quá nhiều thuộc tính, không phải lúc nào ta cũng nhớ được hết các thuộc tính của bảng. Mỗi khi có sự thay đổi thêm bớt thuộc tính nó cũng sẽ tự động update lại đoạn comment trên.

  • Pg_search là một giải pháp thay thế khá tốt cho ElasticSearch khi làm việc với PostgreSQL. Nó hỗ trợ 2 cách tìm kiếm là multi-search và search scopes. Multi-search là khi mà ta muốn tìm trên nhiều Active Record, ví dụ như với cùng 1 đoạn text muốn tìm kiếm trên cả bảng A và bảng B, nó sẽ giúp ta trộn lẫn dữ liệu và đánh index cho nó. Cách còn lại là search scopes, cho phép tìm kiếm nâng cao hơn trên 1 Active Record, nó sẽ có ích khi xây dựng những tính năng như autocomplete (tự động hoàn thành, như google đoán trước mình muốn search cái gì) hoặc lọc theo một giá trị nào đó.
  • Wicked giúp ta xây dựng các trang step-by-step (như kiểu google form có nhiều trang, hoặc là như form tạo mới phải điền form => xác nhận thông tin => submit,...)
  • Config là cách tốt nhất để kết nối các cài đặt đa môi trường của yaml với Rails, Sinatra và các framwork khác của Ruby. Nó giúp quản lý một cách dễ dàng các setting cho từng môi trường. Mặc định nó sẽ tự sinh ra 4 file:
config/settings.yml
config/settings/development.yml
config/settings/production.yml
config/settings/test.yml

Bạn có thể sửa setting cho từng môi trường trong từng file.

  • I18n-tasks giúp bạn tìm và quản lý các bản dịch bị thiếu hoặc không được sử dụng. Nó có thể dùng với bất kì dự án có sử dụng gem I18n làm mặc định. Nó còn có thể thêm bản dịch mới thông qua Google translate API.
  • Money_rails như tên gọi, được dùng với các đơn vị tiền tệ. Nó sẽ tự động update tỉ giá và quy đổi giá tiền thành đơn vị mong muốn.
  • Impressionist cho phép đếm lượt view của trang và gán vào 1 model. Mục đích là để cung cấp số liệu thống kê ngay lập tức, thay vì phải gửi lên Google Analytics và lấy từ API của họ về. Nó có thể sinh ra 1 bảng riêng lưu số lượt view, hoặc là thêm một cột counter_cache vào model và tự động tăng mỗi lần bản ghi đấy được xem, nếu không thích tên counter_cache cũng có thể đặt tên khác bằng cách khai báo:
is_impressionable :counter_cache => true, :column_name => :my_column_name
  • Route_translator: nội dung web thì dịch rồi, nhưng còn 1 cái là URL thì thường được viết mặc định là tiếng Anh, gem này sẽ giúp ta dịch cả URL. Ví dụ như trong file router
Rails.application.routes.draw do
  localized do
    resources :cars, only: [:index, :create]
  end
end

thêm cả vào file locale

es:
  routes:
    cars: coches
    new: nuevo
fr:
  routes:
    cars: voitures
    new: nouveau

thì khi gõ rails routes nó sẽ sinh ra các link sau

 Prefix Verb   URI Pattern                     Controller#Action
       cars_fr GET    /fr/voitures(.:format)          cars#index {:locale=>"fr"}
       cars_es GET    /es/coches(.:format)            cars#index {:locale=>"es"}
       cars_en GET    /cars(.:format)                 cars#index {:locale=>"en"}
               POST   /fr/voitures(.:format)          cars#create {:locale=>"fr"}
               POST   /es/coches(.:format)            cars#create {:locale=>"es"}
               POST   /cars(.:format)                 cars#create {:locale=>"en"}
    new_car_fr GET    /fr/voitures/nouveau(.:format)  cars#new {:locale=>"fr"}
    new_car_es GET    /es/coches/nuevo(.:format)      cars#new {:locale=>"es"}
    new_car_en GET    /cars/new(.:format)             cars#new {:locale=>"en"}

Nguồn tham khảo: https://medium.com/codica/40-best-ruby-gems-we-cant-live-without-8ccf314fcd38