Ruby and Rails gem for web developer(Part I)

Tôi đã được lập trinh bằng ngôn ngữ ruby được tròn 10 tháng , và trong khoảng thời gian này , đã có rất nhiều vấn đề xảy ra trong khi giải quyết công việc .Những tác vụ , chức năng những bài toán mà dự án cần có đôi khi rất khó để giải quyết. Đối với những lập trình viên có kinh nghiệm lâu năm thì việc giải quyết chúng có khả năng là đơn giản nhưng đối với những lập trình viên kinh nghiệm ít thì việc tìm hiểu 1 cái gì đó mới mẻ hơn có thể giúp giải quyết vấn đề đó 1 cách nhanh chóng và dễ dàng hơn.Trong bài viết này tôi sẽ tổng hợp cho bạn một số gemfile cần thiết và rất hữu dụng , giúp bạn có thể dễ dàng xác định được gem mình muốn dùng để giải quyết bài toán của mình , tất nhiên để hiểu kỹ được nó , bạn phải mất 1 khoảng thời gian nào đó để nghiên cứu nhé .

1.Awesome Print

Trong suốt thời gian lập trình tôi chắc chắn rằng , các lập trình viên đã sử dụng rất nhiều đến rails console or terminal để kiểm tra dữ liệu cũng như đối tượng nào đó .Bây giờ hãy bật terminal cùa ban lên và chạy lệnh User.last , hãy xem kết quả trả về nhé :

2.3.1 :001 > User.last
  User Load (18.0ms)  SELECT  `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
 => #<User id: 1, old_member_id: 1, first_name: "Jimmy", last_name: "Tr", email: "[email protected]", state: "active", access_token: "", access_secret: "763468356", hope_m_position_id: 2, current_m_position_id: 1, hope_m_occupation_id: 2, current_m_occupation_id: 1, current_m_industry_id: 1, start_working_year: 2015, num_of_learning_day: 0, last_learning_day: nil, created_at: "2017-02-07 08:19:28", updated_at: "2017-02-13 07:33:36", name: nil, password: nil, pm_company: nil, last_login_at: nil, avatar: nil> 
2.3.1 :002 >

Kết quả trả về có một vấn đề đó là khi các thuộc tính của class User quá nhiều sẽ khiến cho kết quả trờ nên dài và khó đọc, vì thế khi kiểm tra User.all thì càng khó đọc hơn nữa .Và Awesome Print đã giúp chúng ta giải quyết vấn đề này , hãy cài đặt gem và xem sự thay đổi nhé:

# Gemfile
  gem "awesome_print", require:"ap"

Tiếp đó chạy bundle install và restart lại terminal, bạn nhớ phải thêm option require:"ap" này nhé , để kiểm tra sự thay đổi ta gõ lệnh : ap User.last, và kết quả:

2.3.1 :001 > ap User.last
  User Load (0.1ms)  SELECT  `users`.* FROM `users` ORDER BY `users`.`id` DESC LIMIT 1
#<User:0x007f3e711af160> {
                         :id => 1,
              :old_member_id => 1,
                 :first_name => "Jimmy",
                  :last_name => "Tr",
                      :email => "[email protected]",
                      :state => "active",
               :access_token => "",
              :access_secret => "763468356",
         :hope_m_position_id => 2,
      :current_m_position_id => 1,
       :hope_m_occupation_id => 2,
    :current_m_occupation_id => 1,
      :current_m_industry_id => 1,
         :start_working_year => 2015,
        :num_of_learning_day => 0,
          :last_learning_day => nil,
                 :created_at => Tue, 07 Feb 2017 17:19:28 JST +09:00,
                 :updated_at => Mon, 13 Feb 2017 16:33:36 JST +09:00,
                       :name => nil,
                   :password => nil,
                 :pm_company => nil,
              :last_login_at => nil,
                     :avatar => #<ImageUploader:0x007f3e712506f0 @model=#<User id: 1, old_member_id: 1, first_name: "Jimmy", last_name: "Tr", email: "[email protected]", state: "active", access_token: "", access_secret: "763468356", hope_m_position_id: 2, current_m_position_id: 1, hope_m_occupation_id: 2, current_m_occupation_id: 1, current_m_industry_id: 1, start_working_year: 2015, num_of_learning_day: 0, last_learning_day: nil, created_at: "2017-02-07 08:19:28", updated_at: "2017-02-13 07:33:36", name: nil, password: nil, pm_company: nil, last_login_at: nil, avatar: nil>, @mounted_as=:avatar>
}
 => nil 
2.3.1 :002 >

Như các bạn thấy kết quả trả về rất dễ nhìn và đọc , các bạn có thể tham khảo chi tiết trên github: Link github

2.Foreigner

Đây là một gem hỗ trợ cho việc thêm khóa ngoại cho bảng , nó rẩt dễ sử dụng , chỉ cần bạn thêm gem và thêm 2 phương thức mới : add_foreign_key và remove_foreign_key , theo đó bạn có thể thêm/xóa khóa từ việc create_table, change _table, với phương thức foreign_key và remove_foreign_key.Giả sử chúng ta thêm khóa ngoại cho bảng Comment.Chúng ta có thể dùng cách:

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

Chi tiết bạn có thể tham khảo tại link: Link github

3.Letter_opener

Đây là 1 gem rất đơn giản và hữu ích .Nó là một plug để lưu email trong các tập tin thay vì gửi chúng.Để genm này hoạt động chúng ta cần thêm nó vào gem file và chạy bundle install:

gem "letter_opener", :group => :development

Ngoài ra chúng ta cần cài đắt delivery method trong file config/environments/development.rb Và bây giờ email sắn sàng được lưu trữ trong thư mục tmp/letter_opener và email mới sẽ được xem trước trong trình duyệt ngay sau khi bạn gửi đi .Rất dễ dàng và thực tế.Link tham khảo chi tiết: Link github

4.Kaminari

Gem này cho phép tạo phân trang một cách dễ dàng .Nó hỗ trợ trên một số OMs(ActiveRecord, Mongoid, MongoMapper) và template (ERB, Haml, Slim) Để sử dụng được kaminari chúng ta cần thêm chúng vào gemfile ,chạy bundle install.Sau đó chúng ta đã có thể sử dụng các funtions của nó : page, per and padding :

@users = User.order(:name).page(params[:page]).per(30)

Và trên view ta chỉ cần :

<%= paginate @users %>

Ngoài ra Để hỗ trợ phân trang cho một mảng thì kaminari có phương thức paginate_array:

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

Nếu bạn muốn customize nó theo trên view hay giá trị mặc định , Localization(I18n), frriendly url thì hãy tạo template của chúng bằng cách chạy :

rails g kaminari:views default

Link tham khảo chi tiết: Link github

5.CarrierWave

Với CarrierWave việc upload file trở nên dễ dàng hơn , điều bạn cần làm là : Tạo 1 model tên là uploader :

rails generate uploader ProductPhotoUploader

Và config 1 số option (option này các bạn tùy chỉnh nhé ):

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

Tất cả đã sắn sàng sử dụng để upload file và lưu trữ chúng trong kho chứa:

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

CarrierWave có rất nhiều hỗ trợ hữu ích , bạn có thể tham khảo bài viết trước của tôi hoặc tìm hiểu nó trong link này nhe: Link github

6.WickedPdf

WickedPdf là 1 plugin của ROR , giúp cho việc generate PDF file từ html rất dễ dàng . Wicked PDF hoạt động với Ruby versions từ 1.8.7 đến 2.3 và rails 2 đến 5.0. Để sử dụng được nó chúng ta cần thêm vào gemfile sau đó chạy bundle install.Tiếp đó chạy lệnh:

rails generate wicked_pdf

đăng ký mine-type:

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

WickedPdf render PDF file với rất nhiều option khác nhau và thực sự nó rất hiệu quả , bạn nên xem chúng chi tiết để có thể sử dụng nó tốt hơn : Link github

7.CanCanCan

Cancancan là 1 thư viện cho phép quản lí phân quyền , với sự hỗ trợ của nó bạn có thể dễ dàng phân quyền hay hạn chế quyền truy cập vào 1 tài nguyên nhất định .Ưu điểm của nó là tất cả các quyền được lưu trữ tại một nơi và chúng sẽ không bị lặp lại trong các file controller. Đầu tiên bạn cần gen ra 1 model tên là Ability:

rails g cancan:ability

Việc phân quyền sẽ được quản lí thông qua phương thức can/cannot:

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

Code trên được hiểu là nếu user là Admin thì không thể quản lí profile và có thể đọc được tất cả , còn nếu user là Moderator thì có thể quản lí Apartment, RoomPrice, Photo, Lessor, profile. Sau đó trên views bạn sử dụng can? và cannot? để hỗ trỡ cho việc kiểm tra current_user:

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

code trên có nghĩa là nếu current_user có thể update article hiển thị nút edit Ngoài ra bạn có thể sử dụng phương thức authorize! sseer xác thực người dùng trong controller:

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

Để tìm hiểu thêm nhiều tính năng hữu ích của nó hãy tham khảo chi tiết link Link github

Trong phần I này mình xin phép giới thiệu 7 gemfile rất hữu dụng khi lập trình Ruby And Rails , Phần II mình tiếp tục giới thiệu với các bạn nhiều gem file hơn .