12/08/2018, 17:59

Top 10 Gem hữu dụng trong việc lập trình web bằng Rails!

Mình đã code bằng Ruby on Rails trong kha khá thời gian và đã giải quyết nhiều bài toán khá phức tạp bằng cách sử dụng framework tuyệt vời này. Dựa trên kinh nghiệm làm việc với RoR, mình đã lập nên một danh sách các Gem mà mình cho là hữu ích nhất. Trong bài viết này, mình muốn chia sẻ danh sách ...

Mình đã code bằng Ruby on Rails trong kha khá thời gian và đã giải quyết nhiều bài toán khá phức tạp bằng cách sử dụng framework tuyệt vời này. Dựa trên kinh nghiệm làm việc với RoR, mình đã lập nên một danh sách các Gem mà mình cho là hữu ích nhất. Trong bài viết này, mình muốn chia sẻ danh sách này và cho các bạn thấy làm thế nào để tìm được các Gem hữu ích cho RoR.

Bạn có thể tìm thấy nhiều gem trên tran rubygems.org hoặc trên github. Việc tìm kiếm có thể được thực hiện thông qua việc mô tả chức năng gem (trên GitHub, bạn phải chọn Ruby trong danh sách các ngôn ngữ được đưa ra).

Một trang đáng được nhắc đến khi bạn muốn tìm kiếm Gem là Ruby Toolbox. Nó cho phép bạn tìm kiếm Gem theo thể loại và mức độ phổ biến. Nhưng không nên chỉ dựa vào nguồn này vì tác giả của trang web Ruby Toolbox cập nhập danh sách Gem một cách hoàn toàn thủ công.

Gem này giúp chúng ta tạo các khóa ngoại cho các bảng. Nó rất dễ sử dụng. Bạn chỉ cần đặt nó vào Gemfile, chạy bundle, nó sẽ thêm cho bạn hai phương thức mới vào migrations : add_foreign_keyremove_foreign_key. Ngoài ra, bạn sẽ có thể thêm / xóa các khóa ngay từ khi create_table và cả khi change_table với các phương thức foreign_keyremove_foreign_key.

Hãy tưởng tượng rằng chúng ta cần thêm một khóa từ bảng comments vào bảng posts. Chúng ta có thể làm điều đó theo cách sau:

class CreateComments < ActiveRecord::Migration
   def change
      create_table :comments do |t|
         # … t.references :post
         # ...
         t.foreign_key :posts
      end
   # …
   end
end

Các phương pháp này có một số tùy chọn bổ sung, ví dụ như: name, column, dependent,... Bạn có thể đọc thêm về chúng trong tài liệu này.

Một số người có thể cho rằng nó không hữu dụng trong các phiên bản của Rails, nhưng điều đó chỉ tính từ phiên bản 4.2 (khi mà chức năng như vậy đã có sẵn). Trong các trường hợp khác, theo ý kiến của mình, Gem này xứng đáng có 1 vị trí trong danh sách những Gem hữu dụng cho RoR.

Link to GitHub

Một Gem đơn giản nhưng rất hữu ích. Trong thực tế, nó là một plugin để lưu email trong các tập tin thay vì gửi chúng. Để kích hoạt gem này, bạn phải đặt letter_opener như một delivery method trong cấu hình của app (ví dụ trong config / enviroments / development.rb).

config.action_mailer.delivery_method =: letter_opener

Bây giờ tất cả các thư gửi đi sẽ được lưu trữ trong thư mục / tmp / letter_opener và các email mới sẽ được xem trước trong trình duyệt ngay sau khi dược gửi. Nó rất dễ dàng và thiết thực.

Link_to_GitHub

Nếu bạn đã từng làm việc với Rỏ trong một khoảng thời gian, ắt hẳn bạn sẽ không còn xa lạ gì với Gem này nữa. Kaminari cho phép bạn dễ dàng tạo các phân trang cho bất cứ danh sách nào.

Để bắt đầu sử dụng Kaminari, bạn cần đưa nó vào trong Gemfile. Một số chức năng sẽ có sẵn ngay sau khi chạy bundle, ví dụ như: page, per_page và padding. Bây giờ bạn có thể dễ dàng chuyển đổi mảng của bạn thành từng phần phân trang một và theo sau đó là rất nhiều tính năng phân trang hữu ích.

@paginatable_array = Kaminari.paginate_array(my_array_object).page(params[:page]).per(10)

Cấu hình mặc định có thể được chỉnh sửa trong Kaminari.configure. default_per_page, max_per_page, max_pages - đây chỉ là một danh sách ngắn các tùy chọn có thể được thay đổi thoe ý thích người dùng.

Bên cạnh đó, phân trang có thể được cấu hình riêng cho từng model:

class User < ActiveRecord::Base 
paginates_per 50
end

Các mẫu sẽ được tạo trong app/views/kaminari/ và bây giờ bạn có thể dễ dàng chỉnh sửa chúng.

I18n và labels, thêm và url cũng như các tùy chọn hữu ích khác có thể được tìm thấy trong tài liệu hướng dẫn cho Gem này.

Link to GitHub

Tương tự Kaminari, CarrierWave là một Gem hết sức phổ biến đối với người dùng RoR. Với Gem này, bạn có thể tải lên bất kỳ files nào từ ứng dụng RoR của bạn. Tất cả những gì bạn cần làm là: Tạo một uploader:

rails generate uploader ProductPhotoUploader

Tiếp theo, thêm vài dòng tùy chọn:

class ProductPhotoUploader < CarrierWave::Uploader::Base
   include CarrierWave::MiniMagick
   storage :file
   def store_dir
      "product_images"
   end
   def extension_white_list
      %w(jpg jpeg gif png)
   end
   def filename
      Digest::SHA1.hexdigest(self.read) + File.extname(original_filename)
   end
end

Và bạn đã có thể sử dụng uploader để lưa files:

uploader = ProductPhotoUploader.new
uploader.store!(my_file)

CarrierWave cũng cho phép lưu trữ tệp trong phần lưu trữ tạm thời, hệ thống tệp và thậm chí trong cả đám mây.

Bạn có thể kết nối trình tải lên CarrierWave với ActiveRecord model và lưu tệp của bạn bằng cách lưu bản ghi trong cơ sở dữ liệu:

class Retailer < ActiveRecord::Base
   mount_uploader :logo, RetailerLogoUploader
end
retailer = Retailer.new
File.open('logo.jpg') { |f| retailer.logo = f }
retailer.save!
retailer.logo.url # => '/url/to/logo.png'

Ngoài ra, bạn còn có thể thay đổi chất lượng của hình ảnh đã tải lên, cắt hình ảnh, mã hóa các tệp và nhiều thứ khác, trong khi tải chúng lên - tất cả điều này có thể được tìm thấy trong tài liệu của CarrierWave.

Link_to_GitHub

Một Gem đơn giản và dễ sử dụng để chuyển đổi các chuỗi ký tự lạ phụ thành chuỗi URI an toàn ASCII. Sau khi cài đặt gem này, bạn có thể gọi hàm urlify cho bất kỳ chuỗi nào và nó sẽ ngay lập tức được chuyển đổi thành một URI tương thích:

URLify.urlify('Kj?le Test') #=> kjoele_test

Hoặc:

URLify.urlify('Kj?le Test', '-') #=> kjoele-test

Link_to_GitHub

Nó là một plugin cho RoR, giúp tạo PDF từ html. Sau khi thêm Gem này, bạn cần thực hiện các bước tiếp theo: Chạy lệnh khởi tạo:

rails generate wicked_pdf

Ghi lại loại:

Mime::Type.register "application/pdf", :pdf

Hãy chú ý rằng Gem này sử dụng tiện ích wkhtmltopdf và đường dẫn đến tiện ích này sẽ được chỉ định trong phần cài đặt của gem.

WickedPdf.config = { exe_path: '/usr/local/bin/wkhtmltopdf' }

Link_to_GitHub

Nếu bạn phải đối mặt với vấn đề đòi hỏi phải có thông tin khác nhau về các quốc gia, Gem này sẽ cung cấp tất cả dữ liệu bạn cần để giải quyết nó. Nó cho phép tìm kiếm theo tên quốc gia và theo vùng, thông tin tiền tệ (ký hiệu, mã), các định dạng khác nhau về số điện thoại, tọa độ, v.v. Tất cả những gì cần sau khi cài đặt là tạo một đối tượng quốc gia (hoặc lấy nó từ phần trợ giúp toàn cầu) và sau đó bạn có thể rút ra các thông tin cần thiết:

c = ISO3166::Country.new('UA')
# or to use global helper  = Country['UA']
c.name      #=> "Ukraine"
c.alpha2#=> "UK" c.alpha3#=> "UKR"
c.longitude #=> "49 00 N"
c.latitude  #=> "32 00 E"

Cách lấy thông tin tiền t

c.currency.code   #=> "UAH"
c.currency.symbol #=> "?"
c.currency.name   #=> "Hryvnia"

Bạn phân vân không biết quốc gia đó có thuộc EU hay ko?

c.in_eu? #=> false

Dưới đây là ví dụ về tìm kiếm quốc gia theo tên và đơn vị tiền tệ:

c = ISO3166::Country.find_country_by_name('Ukraine') 
c = ISO3166::Country.find_country_by_currency('UAH')

Link_to_GitHub

Lại một Gem hết sức quen thuộc nữa.

CanCanCan cho phép bạn cài đặt quyền trong RoR. Với sự trợ giúp của nó, bạn có thể dễ dàng hạn chế quyền truy cập vào một số tài nguyên nhất định. Sự tiện lợi của nó nằm trong việc quản lý các quyền truy cập của người dùng với tất cả các quyền được lưu trữ ở một nơi duy nhất. Đó là lý do tại sao bạn không phải lặp lại chúng trong controller, views hoặc những truy vấn cơ sở dữ liệu của bạn.

CanCanCan cần một phương thức current_user được định nghĩa trong controller. Vì vậy, lúc đầu, bạn phải chỉnh lại phần xác thực (ở đây mình đã sử dụng Devise, nhưng cũng có những gem khác có chức năng tương tự). Sau đó, tạo ability:

rails generate cancan:ability

Chỉ định các quyền của người dùng (các phương thức có thể / không thể) với các action: :read, :create, :update:destroy (bạn có thể tìm hiểu thêm trong tài liệu).

class Article::Ability  
  include CanCan::Ability
  def initialize(user)
case user   
  when Admin     
    cannot :manage, :profile     
    can :read, :all       
  when Moderator     
    can :manage, [Apartment, RoomPrice], { lessor_id: user.id }        
    can :manage, Photo, { photographer_id: user.id }     
    can :manage, Lessor, { id: user.id }     
    can :manage, :profile 
end
  end
end

Sau đó, trong views bạn có thể sử dụng các helper can?cannot để kiểm tra quyền của người dùng hiện tại đối với các hành động cụ thể:

<% if can? :update, @article %> <%= link_to "Edit", edit_article_path(@article) %> <% end %>

Ngoài ra, bạn có thể sử dụng authorize! để cho phép các action trong controller:

def show  
  @article = Article.find(params[:id])  
  authorize! :read, @article
end

Hoặc bạn có thể sử dụng load_and_authorize_resource để tải tài nguyên và cấp quyền cho chúng.

Để xử lý các lỗi liên quan đến quyền, bạn có thể bắt ngoại lệ bằng CanCan :: AccessDenied theo cách sau:

class ApplicationController < ActionController::Base 
   rescue_from CanCan::AccessDenied do |exception| 
      redirect_to root_url, :alert => exception.message 
   end
end

Thông tin bổ sung của CanCanCan có thể tìm thấy trong tại liệu dưới đây.

Link_to_GitHub

Gem này cung cấp một DSL (Domain Specific Language) lớn, bằng cách đó, bạn có thể dễ dàng tạo ra các form đẹp, dễ đọc, ngữ nghĩa phong phú. DSL này rất tiện dụng: chỉ cần liệt kê các trường trong một khối semantic_form_for cho đối tượng cần thiết và bạn sẽ nhận được một form hoàn chỉnh:

<%= semantic_form_for @post do |f| %> 
   <%= f.inputs "Basic", :id => "basic" do %> 
      <%= f.input :title %> 
      <%= f.input :body %> 
   <% end %> 
   <%= f.inputs :name => "Advanced Options", :id => "advanced" do %> 
      <%= f.input :slug, :label => "URL Title", :hint => "Created automatically if left blank", :required => false %> 
      <%= f.input :section, :as => :radio %> 
      <%= f.input :user, :label => "Author" %> 
      <%= f.input :categories, :required => false %> 
      <%= f.input :created_at, :as => :string, :label => "Publication Date", :required => false %> 
   <% end %>
   <%= f.actions do %>
      <%= f.action :submit %> 
   <% end %>
<% end %>

Nó cũng hoạt động với các dữ liệu lông nhau:

<%= semantic_form_for [@author, @post] do |f| %>

Form lồng nhau cũng hoàn toàn khả dụng. Bạn có thể sử dụng f.semantic_form_for nhưng phong cách Formtastic trông đẹp hơn với :for tùy chọn:

<%= semantic_form_for @post do |f| %>
   <%= f.inputs :title, :body, :created_at %> 
   <%= f.inputs :first_name, :last_name, :for => :author, :name => "Author" %> 
   <%= f.actions %>
<% end %>

Bạn có thể dễ dang thay đổi input:

class StringInput < Formtastic::Inputs::StringInput 
   def to_html
      puts "this is my modified version of StringInput"
      super
   end
end

Tạo input của riêng bạn với dữ liệu hiện có:

class FlexibleTextInput < Formtastic::Inputs::StringInput 
   def input_html_options 
      super.merge(:class => "flexible-text-area")
   end
end

Sau đó bạn có thể sử dụng nó như sau:

 :as => :date_picker

Formtastic hỗ trợ một danh sách ấn tượng các kiểu đầu vào bao gồm: select, check_boxes, radio, time_zone, datetime_select, range,... localization cơ bản và nâng cao, belongs_to, has_many và has_and_belongs_to_many liên kết và nhiều tính năng khác mà bạn có thể đọc từ tài liệu sau.

Link_to_GitHub

Công cụ này cho phép thực hiện các lệnh trên nhiều máy từ xa song song thông qua SSH. Gem này cho phép bạn xác định các tác vụ sẽ được áp dụng cho các máy có vai trò nhất định. Nó cũng hỗ trợ các kết nối tunnel thông qua một máy cổng vào.

Sau khi cài đặt Gem, bạn phải chạy lệnh:

bundle exec cap install

Điều này sẽ tạo một thư mục để cấu hình.

Nếu bạn định sử dụng các môi trường khác nhau, bạn phải thêm thông số STAGES, ví dụ: STAGES = local, sandbox, qa, production.

Để chạy một cap-script, sử dụng lệnh exec-bundle exec cap [ environments separated by gaps ] [ command ]. Ví dụ, triển khai cho môi trường staging sẽ như sau:

bundle exec cap staging deploy

Dưới đây là một ví dụ đơn giản:

server 'example.com', roles: [:web, :app]
server 'example.org', roles: [:db, :workers]
desc "Report Uptimes"
task :uptime do 
   on roles(:all) do |host|
      execute :any_command, "with args", :here, "and here"
      info "Host #{host} (#{host.roles.to_a.join(', ')}):	#{capture(:uptime)}"
   end
end

Xem tài liệu dưới đây để tra cứu các tham số có thể có, biết thêm chi tiết về cách xác định tác vụ, kết nối các plug-ins và nhiều thứ khác.

Link_to_GitHub

Vậy là các bạn đã đi qua hết danh sách các Gem mà mình cho là rất hữu dụng trong việc lập trình nên một trang web hoàn chỉnh. Hi vọng các bạn sẽ tìm lấy cho mình được những thông tin bổ ích trong bài viết này. Nếu có điều gì cần chia sẻ hay có một Gem cho RoR mà bạn cực kỳ tâm đắc nhưng không có trong danh sách trên, hãy comment vào bên dưới để chúng ta cùng trao đổi và nâng cao thêm những thông tin hữu ích nhé. Hẹn gặp lại các bạn trong bài viết sau! Nguồn

0