Jex’s Note

Rails - 其他套件

Gem commands

  • gem -v : RubyGems 版本
  • gem update --system : 升級 RubyGems
  • gem install gem_name : 安裝某個套件, 加上 --no-ri --no-rdoc 不產生文件
  • gem list : 列出安裝的套件
  • gem update gem_name : 更新最新版本
  • gem update : 更新所有 Gem
  • gem install -v x.x.x gemname : 安裝特定版本
  • gem uninstall gem_name : 反安裝

Gemfile 版本符號代表意義

gem 'rails', '4.2.6'
  • 不指定 : 使用最新版
  • 4.2.6 : 明確指定使用 4.2.6
  • ~> 1 : 1.0 ~ 1.9 (小於 2.0)
  • ~> 2.1 : 2.1 ~ 2.9 (小於 3.0)
  • ~> 2.0.3 : 2.0.3 ~ 2.0.9 (小於 2.1)
  • ~> 2.2.beta : will match 2.2.beta.12
  • >= 3.2 : 3.2 以上的版本

引入時指定環境

都不寫代表是全部環境都會引入

gem 'bcrypt'

只引入 development, test

gem 'awesome_print', gorup: :development, :test

或
group :development, :test do
  gem "rspec"
  gem 'rspec-rails'
end

好用的 Gem

必備的 Gem

gem 'autoprefixer-rails'                    # 處理有 prefix 的 css 語法
gem 'bcrypt'                                # 加密,devise 需要
gem 'devise', '~> 3.5.2'                    # 註冊/登入 etc. 整套功能
gem 'mysql2', '~> 0.3.20'                   # MySQL
gem "paperclip", "~> 4.3"                   # 上傳
gem 'will_paginate'                         # 分頁
gem 'migration_comments'                    # 讓 migration 可以在欄位加上註解
gem 'awesome_print'                         # 讓 Rails console 顯示的資料更好閱讀
group :development, :test do
  gem "rspec"                               # Rspec
  gem 'rspec-rails'                         # Rspec
  gem 'factory_girl_rails'                  # Seed 會
  gem 'capybara'                            # 可以摸擬使用者點擊瀏覽器的行為
  gem 'faker'                               # Seed 假資料
  gem 'fabrication'                         # 不知道怎麼形容它,它像是個 Model 的模具,需要時再倒原料進去
end
group :development do
    gem 'quiet_assets'                      # 讓 log 更乾淨,過濾一些 Assets 的 log
    gem 'guard-livereload'                  # 偵測檔案變動,reload 你的瀏覽器
    gem 'better_errors'                     # 當 Error 發生時,讓頁面上顯示的錯誤更好讀
end

看情況用的 Gem

gem 'papercrop', '~> 0.3.0'                             # Crop 圖片,相依於 paperclip
gem 'rolify', '~> 4.1.1'                                # 如果需要細分權限的話
gem 'whenever', require: false                          # cronjob
gem "recaptcha", require: "recaptcha/rails"             # Google recaptcha
gem 'aws-sdk', '~> 2.2.37'                              # AWS SDK
gem 'omniauth-facebook', '~> 3.0.0'                     # FB 登入
gem "paranoia", "~> 2.1.5"                              # 軟刪除
gem 'pg'                                                # 使用 PostgreSQL 當 DB
gem 'rubocop', require: false                           # 可以利用它檢查/更正你不符合 ruby coding style 的程式碼
gem 'rails_12factor', group: :production                # Heroku : 將 rails log 導到標準輸出(STDOUT),否則會無法 Debug

bootstrap

Gemfile

gem 'bootstrap-sass', '~> 3.3.5'
gem 'sass-rails', '>= 3.2'

application.scss (注意副檔名是 .scss)

// "bootstrap-sprockets" must be imported before "bootstrap" and "bootstrap/variables"
@import "bootstrap-sprockets";
@import "bootstrap";

application.js

//= require jquery
//= require bootstrap-sprockets

awesome_print

當用 rails console 撈資料時, 欄位多會造成很難閱讀, 可以藉由 awesome_print 使輸出時好看一點

Gemfile

gem 'awesome_print'

Usage

$ rails console
> ap User.find(1)
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
#<User:0x007f9755c5be78> {
                        :id => 1,
                     :email => "root@gmail.com",
        :encrypted_password => "$2a$10$/O5sGBe8KonKehd1GIFdaeh.RyDdApKmr60gr5t93Zql1S..WqiuS",
      :reset_password_token => nil,
    :reset_password_sent_at => nil,
       :remember_created_at => nil,
             :sign_in_count => 2,
        :current_sign_in_at => Sat, 04 Jul 2015 09:17:54 UTC +00:00,
           :last_sign_in_at => Sat, 04 Jul 2015 09:14:21 UTC +00:00,
        :current_sign_in_ip => "127.0.0.1",
           :last_sign_in_ip => "127.0.0.1",
                :created_at => Sat, 04 Jul 2015 09:12:24 UTC +00:00,
                :updated_at => Sat, 04 Jul 2015 09:17:54 UTC +00:00,
        :confirmation_token => nil,
              :confirmed_at => Sat, 04 Jul 2015 09:12:23 UTC +00:00,
      :confirmation_sent_at => nil
}
 => nil

Cron jobs

有時候主機需要一個背景需要可以一直跑的程式, 例如幫你檢查 DB 某個欄位再做對應的事

whenever

Install

gem 'whenever', :require => false

bundle install
wheneverize .

會產生 config/schedule.rb, 在這裡定義你的 cron job

注意! 無法直接在 schedule 裡寫 Rails 語法, 維持這裡的乾淨, 定義 cron job 要做的事情就好, 把任務定義在 task

Example

每一分鐘寫入一次檔案或 task

every 1.minute do
  command "/bin/echo '1' >> /tmp/test"
  rake "schedule:find"
end

every 30 minutes between 6 to 9.

every '*/30 6-9 * * *' do
  runner "Model.method"
end

使用步驟

預設的定義檔路徑是 config/schedule.rb, 所以要到 rails app 下執行

1) 查看轉換為 cron syntax 的語法, 但還不會寫入

whenever
whenever --set environment=development              # 執行 rake 必須加上

whenever 執行 rake 指令預設是 production,

2) 寫入 cron

whenever -w

或 update

whenever -i

如果一次 update development 及 production 環境的 schedule, 但只會有一種被寫進 cronjob

註) 啟動後 cron job 就會開始跑了, 因為它是使用系統的 cron job, 所以即使 rails 沒啟動它仍然會在背景跑

如果在啟動後輸入 crontab -e 就會看到剛剛寫入的以下內容

# Begin Whenever generated tasks for: /Users/jex/Desktop/projects/rails/translate/config/schedule.rb
* * * * * /bin/bash -l -c '/bin/echo '\''1'\'' >> /tmp/test'

# End Whenever generated tasks for: /Users/jex/Desktop/projects/rails/translate/config/schedule.rb

Rails 的 production 與 dev 的 cronjob 可同時存在

清除 cron job

whenever -c

在同一個 Rails app 不管執行的是 production, development 都會被清掉

example

lib/tasks/schedule.rake

namespace :schedule do
  desc "TODO.."
  task :find do
    Rails.logger.info(1)
  end
end

缺點

它是在執行的時候從頭啟動 rails 再執行你的 function,會有這麼一點效能浪費,我覺得是個小問題

sitemap_generator

是否該使用 sitemap 可以根據 google 的手冊來決定

1) 根據這個套件的 README 就可以順利安裝, 記得將 sitemap.rb 放在根目錄, 因為產生的 sitemap.xml.gz 會被放在 public/

2) 記得在 robots.txt 加上

Sitemap: https://www.example.com/sitemap.xml.gz

3) 到 google 的 search console 加入你的網站 (會要求你用一些方法確認是你的網站, 加上 <meta> 標簽的方法較簡單), 加入成功後左邊 menu 選擇 Sitemap 並且提交

Comments