PJCHENder 未整理筆記

[Gem] 常用模組套件

2019-06-08

[Gem] 常用模組套件

@(Ruby on Rails)[rails, 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
1
gem install gem_name
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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 筆資料」的意思:

1
2
3
4
5
6
7
8
9
10
11
12
13
# ./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 檔

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

enumerize

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

基本設定

使用 enumerize 關鍵字:

1
2
3
4
5
6
# migration(Active Record)
class User
extend Enumerize

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

取值

1
2
3
4
5
6
7
# controller

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

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

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

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

Boolean 方法

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

Predicate 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
module PersonEnumerations
extend Enumerize

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

class Person
include PersonEnumerations
end

class User
include PersonEnumerations
end

為 enumerized 屬性添加值

1
2
3
4
5
6
7
8
9
10
11
12
13
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 中加入:

1
gem "chartkick"

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

1
2
//= require Chart.bundle
//= require chartkick

即可開始使用。

掃描二維條碼,分享此文章