Cách tạo Rails gem từ Jquery plugin
Đối với một Ruby developer thì việc sử dụng các gem trong các dự án về Ruby cũng như Rails là một điều vô cùng quen thuộc. Sau một thời gian tìm hiểu, tôi có biết cách đơn giản để tự xây dựng một gem từ một Jquery plugin để sử dụng trong Rails project. Trong bài viết này, tôi xin trình bày các bước ...
Đối với một Ruby developer thì việc sử dụng các gem trong các dự án về Ruby cũng như Rails là một điều vô cùng quen thuộc. Sau một thời gian tìm hiểu, tôi có biết cách đơn giản để tự xây dựng một gem từ một Jquery plugin để sử dụng trong Rails project. Trong bài viết này, tôi xin trình bày các bước để xây dựng một gem đơn giản cho Rails từ một Jquery plugin.
Việc đầu tiên và cũng là quan trọng nhất đó là ta phải lấy mã nguồn của plugin mà mình muốn chuyển đổi. Trong khuôn khổ bài viết này, tôi sẽ sử dụng plugin timeago để xây dựng thành gem time_ago_client.
Đầu tiên cần khởi tạo một gem mới của bạn bằng câu lệnh: bundle gem time_ago_client như sau:
$ bundle gem time_ago_client create time_ago_client/Gemfile create time_ago_client/.gitignore create time_ago_client/lib/time_ago_client.rb create time_ago_client/lib/time_ago_client/version.rb create time_ago_client/time_ago_client.gemspec create time_ago_client/Rakefile create time_ago_client/README.md create time_ago_client/bin/console create time_ago_client/bin/setup create time_ago_client/.travis.yml create time_ago_client/.rspec create time_ago_client/spec/spec_helper.rb create time_ago_client/spec/time_ago_client_spec.rb create time_ago_client/LICENSE.txt create time_ago_client/CODE_OF_CONDUCT.md Initializing git repo in /Users/luongvietdung/Documents/workspace/demo_viblo/time_ago_client
Sau khi đã khởi tạo xong một gem, tiếp theo thì cũng giống như một ứng dụng Rails thì ta sẽ cần phải copy mã ngồn của thư viện bên thứ ba vào thư mục vendor/assets/javascripts, mà cụ thể ở đây chính là thư viện jquery timeago. Sau khi đã thực hiện sẽ có được một project gem có cấu trúc như sau:
├── Gemfile ├── LICENSE.txt ├── Rakefile ├── lib │ ├── time_ago_client │ │ └── version.rb │ └── time_ago_client.rb ├── time_ago.gemspec └── vendor └── assets └── javascripts └── jquery.timeago.js
Tiếp theo, ta sẽ tạo file javascript app/assets/javascripts/timeago.js để sử dụng trong app chính sau này. Nội dung file này rất đơn giản, chỉ cần khai báo và sử dụng phương thức timeago() của plugin:
// app/assets/javascripts/timeago.js //= require jquery.timeago //= require jquery.timeago.ja // Sử dụng ngôn ngữ Tiếng Nhật $(document).ready(function() { $("time.timeago").timeago(); });
Bước tiếp trong quá trình tạo gem là ta cần thay đổi trong module TimeAgoClient để module này có thể kế thừa ::Rails::Engine như sau:
# lib/time_ago_client.rb require "time_ago_client/version" module TimeAgoClient class Engine < ::Rails::Engine end end
Cuối cùng, bởi vì ta có thể publish gem này cho cộng đồng nên cần thay đổi các thông tin cơ bản tong file gemspec. Ví dụ như sau:
# time_ago_client.gemspec # coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) require 'time_ago_client/version' Gem::Specification.new do |spec| spec.name = "time_ago_client" spec.version = TimeAgoClient::VERSION spec.authors = ["Luong Viet Dung"] spec.email = ["luong.viet.dung@framgia.com"] spec.summary = %q{A gem to integrate the timeago.js} spec.description = %q{A gem to integrate the timeago.js} spec.homepage = "https://github.com/luongvietdung/timeagoclient" spec.license = "MIT" spec.files = `git ls-files -z`.split("x0").reject do |f| f.match(%r{^(test|spec|features)/}) end spec.bindir = "exe" spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) } spec.require_paths = ["lib"] spec.add_development_dependency "bundler", "~> 1.14" spec.add_development_dependency "rake", "~> 10.0" end
Về cơ bản đến bước này thì gem đã hoàn thành và có thể sử dụng được. Tuy nhiên, cũng có thể tạo thêm các helper tuỳ từng nhu cầu của mọi người. Ví dụ là tạo ra một helper để sinh ra thẻ HTML để hiển thị time ago:
# app/helpers/time_ago_client_helper.rb module TimeAgoClientHelper def timeago(time, options = {}) options[:class] ||= "timeago" content_tag( :time, time.to_s, options.merge(datetime: time.getutc.iso8601) ) if time end end
Như vậy, đến đây chúng ta đã hoàn thành phần cài đặt cho gem time_ago_client
Để publish lên RubyGem trước tiên bạn cần đăng ký tài khoản tại đây. Sau đó trong thư mục của project gem ta thực hiện build gem:
$ gem build time_ago.gemspec
Câu lệnh trên sẽ sinh ra một file mới là time_ago_client-0.1.0.gem. Bây giờ ta chỉ cần push file này lên RubyGem bằng lệnh sau là hoàn thành việc publish:
$ gem push time_ago_client-0.1.0.gem
Từ bây giờ để sử dụng gem ta chỉ cần khai báo gem time_ago_client trong Gemfile giống như bất kỳ các gem phổ biến khác. Chi tiết về cách sử dụng có thể xem đây
Trong bài viết trên, tôi đã trình bày cách tạo gem đơn từ một Jquery plugin như thế nào. Hy vọng bài viết có ích cho mọi người. Cảm ơn đã theo dõi! Demo bài viết:
- https://github.com/luongvietdung/timeagoclient
- https://github.com/luongvietdung/timeagoclientexample
http://brandonhilkert.com/blog/how-to-build-a-rails-engine/