12/08/2018, 13:58

Những thư viện Ruby hữu dụng mà hầu như các dự án đều sử dụng

Khi bạn làm việc với một ngôn ngữ lập trình yêu thích của mình, bạn thường tìm kiếm các công cụ hỗ trợ để giúp cho công việc của mình trở nên dễ dàng hơn. Trong thế giới Ruby, các công cụ này (gems) được tạo ra và cập nhật hàng ngày, nhưng chỉ có một số trong số chúng là tốt. Dưới đây tôi sẽ giới ...

Khi bạn làm việc với một ngôn ngữ lập trình yêu thích của mình, bạn thường tìm kiếm các công cụ hỗ trợ để giúp cho công việc của mình trở nên dễ dàng hơn. Trong thế giới Ruby, các công cụ này (gems) được tạo ra và cập nhật hàng ngày, nhưng chỉ có một số trong số chúng là tốt.

Dưới đây tôi sẽ giới thiệu cho bạn đọc về những Gems cốt lõi mà chúng có một vị trí đặc biệt trong hầu hết các Gemfiles. Một vài trong số chúng giúp cho việc debug lỗi, một số khác thì cung cấp các chức năng như xác thực. Chúng đều hữu ích trong gần như bất kỳ các dự án.

1. Devise

Cho dù bạn đang cần một xác thực HTTP đơn giản, hoặc bạn đang tìm kiếm một số hệ thống đăng nhập phức tạp như Google+ và Facebook, giải pháp xác thực với Devise này là rất tốt và sẽ giúp tăng tốc độ công việc của bạn. Devise rất linh hoạt cho Rails, bao gồm 10 modules hữu dụng: gồm có mã hóa mật khẩu, xác thực email, khôi phục và reset mật khẩu, session timeouts, ...

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 20
end

2. CANCANCAN

CanCan là một thư viện cho Ruby on Rails thực hiện việc authorization trong đó hạn chế những resources mà một người dùng nhất định được phép truy cập vào. Tất cả các quyền được quy định tại một nơi duy nhất (Ability class) và không bị trùng lặp trên controllers, views và database queries.

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

3. Better Errors

Những trang lỗi tiêu chuẩn của Rails cung cấp những thông tin có giá trị, nhưng chúng là tĩnh, nên chúng ta không thể kiểm tra được những gì đang thực sự xảy ra bên cạnh những stack trace đó. Better Errors kết hợp với binding_of_caller, cho phép bạn kiểm tra mã nguồn trực tiếp thông qua một giao diện điều khiển hoạt động trên các stack frame.

68747470733a2f2f692e696d6775722e636f6d2f367a42474141622e706e67.png

4. HAML

Haml là một công cụ templating cho HTML. Nó được thiết kế giúp cho việc viết HTML được dễ dàng, nhanh chóng và đẹp mắt hơn, bằng các loại bỏ các dư thừa, phản ánh cấu trúc cơ bản mà văn bản thể hiện, cũng cấp một cú pháp thanh lịch

%p
  Date/Time:
  - now = DateTime.now
  %strong= now
  - if now > DateTime.parse("December 31, 2006")
    = "Happy new " + "year!"

5. Rspec-rails

Testing là một bước quan trọng trong quá trình phát triển của bất kì dự án Rails nào. Gem này giúp bạn dễ dàng tích hợp Rspec, một trong những testing frameworks phổ biến nhất, vào dự án của bạn. Rspec sẽ kiểm tra hành vi thay vì các phương thức cụ thể.

require "spec_helper"

describe User do
  it "orders by last name" do
    hung = User.create!(first_name: "Vuong", last_name: "Hung")
    hang = User.create!(first_name: "Chu", last_name: "Hang")

    expect(User.ordered_by_last_name).to eq([hang, hung])
  end
end

6. Factory_girl_rails

Khi bạn test một dự án nào đó, điều quan trọng là bạn cần có dữ liệu. Các tốt nhất để tạo ra dữ liệu test là sử dụng một factory generator. Gem này giúp cho bạn dễ dàng tích hợp Factory Girl, một factory generator được yêu thích vào trong dự án của bạn.

# spec/factories/user.rb
FactoryGirl.define do
  factory :user do
    first_name "Vuong"
    last_name  "Hung"
  end
end

# spec/models/user_spec.rb
require "spec_helper"

describe User do
  it "orders by last name" do
    hung = create(:user)
    hang = create(:user, first_name: "Chu", last_name: "Hang")

    expect(User.ordered_by_last_name).to eq([hang, hung])
  end
end

7. Pry-rails

Pry giúp bạn debug được code của bạn một cách dễ dàng trong Rails console.

Started GET "/" for 127.0.0.1 at 2014-10-24 09:57:12 +0200
Processing by HomeController#index as HTML
  User Load (0.5ms)  SELECT  "users".* FROM "users"  WHERE "users"."id" = 1  ORDER BY "users"."id" ASC LIMIT 1

From: /home/hnc/workspace/demo_app/app/controllers/home_controller.rb @ line 4 HomeController#index:

    2: def index
    3:   @user = current_user
 => 4:   binding.pry
    5: end

[1] pry(#<HomeController>)> current_user
=> #<User id: 1, email: "admin123@gmail.com", encrypted_password: "$2a$10$AR/1ZnYJS5hqFNtDzx3ZGuGlRlinktNPebsp6Ye5ENn...", reset_password_token: "5e116a7fd356c11cccfcf27ab981e19b5a756dd7c6f2bd64ba...", reset_password_sent_at: "2014-10-24 07:32:34", remember_created_at: nil, sign_in_count: 2, current_sign_in_at: "2014-10-24 07:57:12", last_sign_in_at: "2014-10-24 07:25:25", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", created_at: "2014-10-24 07:25:25", updated_at: "2014-10-24 07:57:12">
[2] pry(#<HomeController>)> cd @user
[3] pry(#<User>):1> email
=> "admin123@gmail.com"

8. Kaminari

Kaminari là một công cụ phân trang mạnh mẽ, tùy biến cao và tinh tế. Nó hỗ trợ cho nhiều ORMs (như ActiveRecord, Mongoid, MongoMapper), nhiều web frameworks (như Rails, Sinatra) v à nhiều template engines (như ERB, Haml).

User.count                    # => 1000
a = User.limit(5); a.count    # => 5
a.page(1).per(20).size        # => 20
a.page(1).per(20).total_count # => 1000
@user = a.page(10).per(20)

# /app/views/users/index.html
<%= paginate @users %>

9. CarrierWave

Gem này cung cấp một cách đơn giản và cực kì linh hoạt để upload các tập tin từ các ứng dụng Ruby. Nó làm việc tốt với Rack dựa trên ứng dụng web, ví dụ như Ruby on Rails

# /app/models/user.rb
class User < ActiveRecord::Base
  mount_uploaders :avatars, MyUploader
end

# /app/uploaders/my_uploader.rb
class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::MiniMagick

  process resize_to_fit: [800, 800]

  version :thumb do
    process resize_to_fill: [200,200]
  end
end

10. Sass

Sass làm cho CSS trở nên fun hơn. Sass là một phần mở rộng của CSS, thêm các quy tắc lồng nhau, các biến, mixins, các selector thừa kế và nhiều hơn thế nữa. Nó được dịch để có định dạng tốt hơn, chuẩn CSS sử dụng công cụ dòng lệnh hoặc một plugin web-framework nào đó.

$blue: #3bbfce;

@mixin table-scaffolding {
  th {
    text-align: center;
    font-weight: bold;
    color: $blue;
  }
  td, th { padding: 2px; }
}

@mixin left($dist) {
  float: left;
  margin-left: $dist;
}

#data {
  @include left(10px);
  @include table-scaffolding;
}

Hi vọng những thông tin ở trên sẽ giúp ích được cho bạn đọc khi bắt đầu dự án Ruby on Rails của mình (yeah)

0