為什麼 2.days.ago 在內建的 irb 會找不到這個方法?這不是 Ruby 語法嗎?

在公開演講或是校園推廣 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 本身看起來好寫,而且就算連不懂程式語言的人看了也大概猜得出來是什麼意思,台下觀眾看到這裡,有的就會開始發出「喔喔喔」的讚嘆聲了。

有的變數變前面有一個冒號(例如 :name),是什麼意思?

隨便打開一個 Rails 專案,應該都看過類似像這樣的內容:

class User < ActiveRecord::Base
  has_many :products
  validates :name, presence: true
end

class Product < ActiveRecord::Base
  belongs_to :user
end

或是

class ProductController < ApplicationControl
  before_action :find_product

  # .. 中略

  private
  def find_product
    @product = Product.find_by(id: params[:id])
  end
end

這在 Rails 專案裡是很常見的寫法,但這裡 :products:user:name 以及 :find_product 是什麼意思呢? 用一般的字串或變數不行嗎?

為什麼 Hash 好像有不同的寫法?

Ruby 裡的 Hash 的寫法,是用一個大括號,裡面是一堆 key 跟 value 的配對組合,一個蘿蔔一個坑,就像這樣:

profile = { :name => "見龍", :age => 18, :title => "紅寶石鑑定商" }

在 Ruby 1.9 之後,Ruby 提供了另一款類似 JSON 格式的 Hash 寫法,上面這行可以改寫成這樣:

profile = { name: "見龍", age: 18, title: "紅寶石鑑定商" }

類別跟模組有什麼不一樣?

在網路上常看到一些介紹 Ruby 裡類別(class)跟模組(module)的差別,有人說他們兩個差別很大,是完全不同的東西。事實上,類別跟模組是很像的。可能很多人不知道,類別跟模組是有血緣關係的,如果你試著這樣做:

puts Class.superclass

你會得到 Module 這個類別。也就是說,在 Ruby 裡,「類別」其實就是「模組」的後代,類別根本就是繼承自模組來的。既然是同一個體系,自然沒有太多的差異。

Ruby 的參數

大家在寫 Rails 專案的時候,一定都有用過 link_to 這個 view helper。問大家一個簡單的問題:

link_to '刪除', user, method: :delete, data: { confirm: 'sure?' }, class:'btn'

請問,上面這段範例中,link_to 方法共有幾個參數?

如果你的答案是 5 個,那你就需要繼續往下看了 :)

attr_accessor 是幹嘛的?

先說結論:

attr_accessor 會幫你在 Ruby 的類別裡產生一對 getter 以及 setter 方法。

不過我想這結論對新手來說有講跟沒講一樣,讓我們繼續往下看。

新年新希望之誠徵 iOS app 開發學徒

新年新希望之誠徵 iOS app 開發學徒

大概兩年前舉辦了一次「徵求 Ruby/Rails 有心人」活動,感謝大家不嫌棄,不過因為人數太多,最後變成了社群活動了 XD

最近再度因為手邊的 iOS 案件在持續增加中(同時也有 Rails 的專案同時在進行),與其要直接找現成的即戰力,不如趁這個機會自己從頭開始帶,雖然會比較辛苦、花時間,但一些開發的習慣可以從一開始就先養成好像也不錯,剛好順便練一下之前準備的 iOS/Swift 教材。

所以我又厚臉皮的想要來徵看看有沒有人願意來給我當學徒。