再見 2016,哈囉 2017!

2016 年快結束了,今年是挺忙的一年,發生了不少有趣的事。
2016 年快結束了,今年是挺忙的一年,發生了不少有趣的事。
隨便打開一個 Rails 專案底下的 Gemfile
檔案,大概會長得像這樣(以 Rails 5.0.0 beta 4 為例):
source 'https://rubygems.org'
gem 'rails', '>= 5.0.0.beta4', '< 5.1'
gem 'sqlite3'
gem 'puma', '~> 3.0'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks', '~> 5.x'
gem 'jbuilder', '~> 2.0'
group :development, :test do
gem 'byebug', platform: :mri
end
group :development do
gem 'web-console'
gem 'listen', '~> 3.0.5'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
移除部份註解節省點空間。在這個例子裡,有些 gem 的後面有加註版本號碼,有的沒有,這些分別是代表什麼意思呢?
也許你曾在 Ruby 或 Rails 專案中寫過這行語法:
require "digest"
puts Digest::MD5.hexdigest("I love you") # => "e4f58a805a6e1fd0f6bef58c86f9ceb3"
上面這段語法的大意是「引用 "digest" 模組,然後使用那個模組裡的某個方法產生 MD5 編碼字串」。但你知道這個 require
到底做了什麼事嗎? 以下將用我自己寫的一個名為 takami 的套件為例,它是一個完全沒功能的空包彈套件,純粹練功用途。
在開發 Ruby on Rails 專案的過程中,一定都看過或用過 rake db:migrate
這個指令,大部份的教學資料可能只會跟你說「只要照著打這個指令就行了」,沒有太多詳細的介紹。
其實這個 rake
指令,是一位已過世但我非常景仰的大師 Jim Weirich 所開發的。如果各位曾經聽說過 Make 這個工具,Rake 就像是 Ruby 版的 Make,你可以用 Ruby 語法來編寫 makefile。
在 Ruby 要安裝套件超簡單的,只要 gem install
指令加上套件的名字,敲完按下 Enter 鍵,就自動會連上網路、下載套件、安裝套件,一氣呵成:
$ gem install takami
Fetching: takami-0.0.1.gem (100%)
Successfully installed takami-0.0.1
Parsing documentation for takami-0.0.1
Installing ri documentation for takami-0.0.1
Done installing documentation for takami after 0 seconds
1 gem installed
如果該套件有需要其它套件,它也會一併順便一起下載、安裝。這個 takami
gem 是我自己做的,其實沒有任何內容在裡面,所以可安心安裝!(咦?!)
在 Rails 專案中,常會在 Controller 裡看到這樣的寫法:
class ProductController < ApplicationController
before_action :find_product, only: [:show, :edit, :update, :destroy]
# .. 中略
private
def find_product
@product = Product.find_by(id: params[:id])
end
end
這是指在執行特定 Action 之前,先去執行 find_product
方法。
在公開演講或是校園推廣 Rails 的時候,我常會開 rails console 出來秀一下 Rails 快速開發的威力:
$ rails console
# 看,這樣寫就可以印出 2 天前的時間
>> 2.days.ago
=> Sun, 24 Apr 2016 00:56:51 UTC +00:00
# 這樣可以印出 10 Megabyte 是多大
>> 10.megabyte
=> 10485760
這真的很驚人,不只程式碼 2.days.ago
本身看起來好寫,而且就算連不懂程式語言的人看了也大概猜得出來是什麼意思,台下觀眾看到這裡,有的就會開始發出「喔喔喔」的讚嘆聲了。