Rails 基本命名及關連
剛開始進入Rails,對於命名這件事情一定非常不習慣。之所以命名這麼重要,也是因為Ruby是物件導向的語言,而Rails更是把許多class、module、method都拆散在不同檔案中,方便管理。如果沒有將命名處理好,很容易不知道一個method是拿來做什麼用的。
以下說明幾個基本命名原則,讓新手可以更快掌握。
檔案命名與呼叫名稱
首先,檔案名稱都是小寫並加上底線(underscore):
posts_controller.rb
但在呼叫這個class時,是用大寫,也就是CamelCase,跟駱駝的背部一樣有很明顯的高低起伏:
PostsController
所以如果你在檔案名稱上看到大寫,最好趕快改成小寫並加上底線。資料庫的table名稱、column名稱也建議都是使用全小寫加上underscore的命名方式。
Model
首先,在command line中產生model,要使用單數。想像model是一個table的名稱,所以用單數來當做整體的概念。
$ rails generate model post
而在一般controller或其他地方呼叫model時,就是使用常數(constant),開頭大寫的單數。
def index
@posts = Post.all
end
Ruby當中大寫的單數是module或class的名稱,而model算是一個class,同樣是用常數來讀取。如果未來有使用concerns或service object,也會使用大寫開頭的常數來呼叫。
與:symbol搭配使用
在建立model關連時,會有以下寫法:
# Post
has_many :comments
# Comment
belongs_to :post
在Rails當中,建立model以後,該名稱的symbol也就代表著那個model,因此使用:post就等於呼叫Post這個model。
而在這裡由於有數量上的關聯,因此has_many後面的model名稱要加上複數。一般來說都是使用單數,只有關聯時才會使用複數。
Controller
與model相對應的controller要與model取相同名字,但使用複數。
$ rails generate controller posts
取相同名字是因為posts_controller.rb就是專門處理與post model相關的內容。這邊記得controller當中會有很多的action,所以是用複數,並在結尾加上 _controller.rb。
然後記得,同一個資料夾底下預設的application_controller.rb
活得好好的就不用特別去改動名稱,加一個s反而會造成Rails讀不到。
View
view的資料夾名稱要與controller相同,檔案名稱則要與action名稱相同。例如posts_controller有兩個action如下:
def index
# 省略
end
def show
# 省略
end
則在view當中就會有一個資料夾叫做posts,底下會有兩個檔案:index.html.erb
和show.html.erb
。當然如果有很多種view格式,就會有不同的檔名結尾例如show.pdf.prawn
,但前面的index和show並不會變。
helper
helper最常與view搭配使用,所以檔案名稱會與view資料夾的命名方式相同,例如posts_helper.rb
,這樣一來Rails就會自動讀取這個檔案內的method提供view使用。以這個情況為例,在所有posts資料夾底下的view,都可以使用這個檔案裡面的helper。其他的controller會搭配其他的helper,但結尾一定都是_helper.rb
如果你耍叛逆,硬要取一個叫posting_helper.rb
,那預設是讀不到的,必須手動require進到檔案當中。不過這比脫褲子放屁還更沒效率,強烈建議就依照Rails的命名方式即可。
Migration
Migration檔案當中,會調整資料庫,因此使用symbol時,所指的都是table名稱,而非model名稱。table名稱通常是model名稱的小寫並在結尾加上s變成複數,例如Post變成posts,所以在migration檔案當中調整時指定的是table名稱:
add_column :posts, :user_id, :integer
以上的情況就不會使用:post。