iT邦幫忙

DAY 30
2

Ruby on Rails 花招百出系列 第 32

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.erbshow.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。

CC圖片授權:Psyckology

最後

最後,鐵人賽終於完賽,感謝ithome有機會讓我整理過去所學。但不得不說這次的文章編輯器真是有非常非常大的進步空間,不能直接貼html code撰寫、也不能用markdown寫作,同一頁停留太長時間會被登出而不通知,不小心重複發文卻不能刪除等等,都是希望未來可以看到再改進的地方。主辦單位辛苦了,也謝謝各位的訂閱和閱讀,謝謝~


上一篇
Rails使用include和join避免 N+1 queries
系列文
Ruby on Rails 花招百出32

尚未有邦友留言

立即登入留言