跳至主要内容

[gem] 常用模組套件

tags: gem, ruby, package, Rails
Package描述其他說明
Devise驗證使用者使用者認證(ihower), Ruby on Rails 實戰聖經(ihower)
Rolify管理使用者角色...
enumerize方便取得資料庫內容...
taggable......
act_as_list排序列表中的物件...
AASM流程管理...
carrierwave圖片上傳處理...
chartkick圖表繪製在 Rails 中可以同時使用 chart.js, google charts 和 High Charts
gem install gem_name
bundler
nokogiri
rails
pg # postgreSql

# Paginator for Rails 4+
gem 'kaminari', '~> 1.0', '>= 1.0.1'

# Enumerated attributes with I18n and ActiveRecord/Mongoid/MongoMapper support
gem 'enumerize', '~> 2.0', '>= 2.0.1'

# Flexible authentication solution for Rails with Warden
gem 'devise', '~> 4.3'

# 讓 Rails Console 好看很多
gem 'pry-rails', '~> 0.3.4'

# Supporting gem for Rails Panel (Google Chrome extension for Rails development)
gem 'meta_request', '~> 0.4.3'

# help to kill N+1 queries and unused eager loading.
gem 'bullet', '~> 5.5', '>= 5.5.1'

# A static analysis security vulnerability scanner for Ruby on Rails applications
gem 'brakeman', require: false

# rspec command for spring
gem 'spring-commands-rspec'

kaminari

製作自動分頁功能。後面的 per(5) 就是「每頁有 5 筆資料」的意思:

# ./app/controllers/admin/coupons_controller.rb
# controller

def index
# 原本是 @posts = Post.all
@posts = Post.includes(:user).page(params[:page]).per(5)

# 透過 AJAX 更新
respond_to do |format|
format.html
format.js
end
end

打開相對應的 view,在想要加上分頁的地方加上 <%= paginate @posts, remote: true %>

建立一支相對應的 JS 檔

// .app/views/admin/events/show.js.erb
document.querySelector('#order-list').innerHTML =
"<%= escape_javascript(render 'orders', orders: @orders) %>";

enumerize

可以在 Rails 中更方便取用 enumerize 的資料。

基本設定

使用 enumerize 關鍵字:

# migration(Active Record)
class User
extend Enumerize

enumerize :sex, in: [:male, :female]
end

取值

# controller

# 取得某個欄位的屬性值
@user.sex_text # or @user.sex.text

# 取得某個 enumerized 屬性的所有值
User.sex.values # or User.enumerized_attributes[:sex].values

在表單中使用時,支援 :only:except

# erb
<%= form_for @user do |f| %>
<%= f.select :sex, User.sex.options %>
<% end %>

Boolean 方法

user.sex = :male
user.sex.male? #=> true
user.sex.female? #=> false

Predicate 方法

# model
class User
extend Enumerize

enumerize :sex, in: %w(male female), predicates: true
end

user = User.new

user.male? # => false
user.female? # => false

user.sex = 'male'

user.male? # => true
user.female? # => false

在不同的 model 中共享相同的 enumerize

可以使用 Ruby 的 Module:

module PersonEnumerations
extend Enumerize

enumerize :sex, in: %w[male female]
end

class Person
include PersonEnumerations
end

class User
include PersonEnumerations
end

為 enumerized 屬性添加值

class User < ActiveRecord::Base
extend Enumerize

enumerize :role, in: {:user => 1, :admin => 2}
end

user = User.new
user.role = :user
user.role #=> 'user'
user.role_value #=> 1

User.role.find_value(:user).value #=> 1
User.role.find_value(:admin).value #=> 2

chartkick

安裝

在 Rails 的 Gemfile 中加入:

gem "chartkick"

./app/assets/javascripts/application.js 中加入:

//= require Chart.bundle
//= require chartkick

即可開始使用。