跳到主要內容

02 用Ruby on Rails純手工打造一個具從屬關係的[討論區] (1)

Getting Started with Rails
Ruby on Rails純手工打造一個具從屬關係的[討論區]
在上一個範例中已經可以用純手工成功的完成簡易的CRUD應用程式,接下來要透過打造一個複雜一點的應用程式[討論區],來練習具有從屬關係的資料結構,也順便練一練CRUD,一定要透過不斷練習讓CRUD變得很自然。

討論區的結構中有許多Po(Post),每個Po文會有許多評論(Comment),這樣的從屬關係非常適合當成範例來說明,所以我們的資料結構如下圖,Comment透過post_idpost做關聯。


1.     has_manybelongs_toconvention
上面這樣的結構我們可以說一個post可以具有has manycomment關係,而commentpost有著belongs to的關係。

l          has_one
l          has_many
l          belongs_to
l          has_many :through

好了,說明完我們的目標結構後,接下來就可以實作了。

1.      建立一個專案
$rails new sample042
$cd sample042

2.      建立一個名為postmodel,其中包含name, titlecontent三個欄位
$rails g model post name:string title:sting content:text
$rake db:migrate
完成後可以在 sample042/db/migrate/20131101062711_create_posts.rb看到:



3.      建立一個名為postscontroller
$rails g controller posts

4.      修改/config/routes.rb
Sample042::Application.routes.draw do
resources :posts


2.     建立commentpost的關聯
Postcomment這樣的透過post_id連結的關聯性,需要透過references的作法關聯起來。


5.      建立一個名為commentmodel,其中包含cmmentbody兩個欄位,以及與post的關聯
$rails g model comment commenter:string body:text post:references
$rake db:migrate

透過post:references所建立的關聯就是本文一開始指的post_id完成後可以在 sample042/db/migrate/ 20131101064406_create_comments.rb看到:



6.      建立一個名為commentcontroller
$rails g controller comments

3.     雙層resources => Nested resources

7.      修改/config/routes.rb
Sample042::Application.routes.draw do
resources :posts do
  resources :comments
end
  


接下來就要逐一修改CRUD結構。

8.      修改 /sample042/app/controllers/posts_controller.rb



9.      修改 /sample042/app/controllers/comments_controller.rb



10.  修改 /sample042/app/models/post.rb



11.  修改 /sample042/app/models/comment.rb



12.  修改 /sample042/app/views/posts/index.html.erb



13.  修改 /sample042/app/views/posts/show.html.erb



14.  修改 /sample042/app/views/posts/new.html.erb



15.  修改 /sample042/app/views/posts/edit.html.erb



16.  修改 /sample042/app/views/comments/index.html.erb
(不會用到)

17.  修改 /sample042/app/views/comments /show.html.erb



18.  修改 /sample042/app/views/comments /new.html.erb



19.  修改 /sample042/app/views/comments /edit.html.erb



20.  做到這邊,我們要來驗收一下成果,透過powder來開瀏覽器驗收吧。
$cd ~/projects/sample042
$powder link
$powder open

21.  完成CRUD功能囉,來驗收一下吧,應該可以看到這些頁面。

在瀏覽器上打上http://sample042.dev/posts/

 


Show出單筆post


新增一筆post



刪除post



Show出單筆post以及該post底下的comments

新增commnet


編輯comment


刪除comment



留言

這個網誌中的熱門文章

利用保存屬性來做實體檔案的差異性備份

先來談談iwndows裡檔案的保存屬性 利用滑鼠右鍵點選[內容]查看檔案的屬性時,在屬性可以看到[唯讀][隱藏]之外還可以點選[進階]按鈕, 其中「檔案已經可以開始封存」就是以前看到的「保存」屬性。 如果在DOS環境下指令attrib,檔名的前面出現「A」就是有「保存」屬性。 而「保存」屬性出現的時機是: 1. 檔案新建立 2. 檔案被變更過內容 因此系統給予此檔案A屬性,就等於告訴備份指令XCOPY或備份軟體,這個檔案需要被備份。 所以,我們可以透過這個屬性來進行檔案的增量式(Incremental)備份與差異式(Differential)備份。 將Files底下所有有異動過的檔案,複製到diff資料夾底下,並且取消此檔案的A屬性。 xcopy "C:\Files\*.*" c:\diff /s/d/y/M 如果我們在這個異動之後將diff資料夾內的所有東西都搬走,我們做的就是差異性備份,如果不搬走讓他一直累積就是增量式備份。 XCOPY 指令 XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W] [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U] [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]\r\r [/EXCLUDE:file1[+file2][+file3]...] source 指定要複製的檔案。 destination 指定位置或者/以及新檔案的名稱。 /A 只複製設定成保存屬性的檔案,不要改變屬性的設定。 /M 只複製設定成保存屬性的檔案,並清除保存屬性。 /D:m-d-y 複製在指定日期當天或之後發生變更的檔案。如果沒有給日期, 只複製那些來源檔案日期比目的檔案日期為新的檔案。 /EXCLUDE:file1[+file2][+file3]... 指定檔案清單字串。每個

系統時間自動校正

在網域內通常為了安全性會防堵所有對外不必要的端口,因此常會在網域內架設一Time Server做為各伺服器時間校對的標準,而此一Time Server需透過UDP 123端口與中央標準局time.stdtime.gov.tw做時間校對,再網域內的其他伺服器則與此Time Server做時間校對。 開啟防火牆NTP端口(UDP 123) 編輯系統登錄檔 [執行] -> regedit 修改NTP Server為中央標準局主機 time.stdtime.gov.tw 並將Type預設值NT5DS改為NTP [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters] "NtpServer"="ComputerName" "Type"="NTP" 修改校對頻率為a (每10分鐘校對一次,5為每5分鐘校對一次) [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config] "AnnounceFlags"=dword:0000000a 重啟Windows Time Service net stop w32time && net start w32time 強制立即校對 w32tm /resync /rediscover 補充一: 強制時間同步指令 w32tm /resync /computer:IP /rediscover net time \IP /set /yes net time \\ComputerName /set /yes 若您的主機一直無法同步,也可以採用變通的方法,配合上面的Dos command以工作排程來進行。 補充二: A. 將伺服器類型變更為 NTP。如果要執行這項操作,請依照下列步驟執行: 1. 按一下 [開始],再按一下 [執行],輸入 regedit,然後按一下 [確定]。 2. 找出並按一下下列登錄子機碼: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\Ty

MHT檔匯出內嵌圖片

今天一個朋友跑來找我說幫幫忙,她在一個網站上想要把網頁上的圖片存下來。我:「在圖片上按滑鼠右鍵不就可以下載了嗎?」 朋友說:「不行,很怪說…。」 我開了那個網頁,心裡滴咕:「哪來的網站維護人員,竟然使用mht檔來發佈網頁,#$^%*&…?!老師教都沒有在聽喔!」 首先,要開啟那個網頁就不容易了(好像有的人可以用IE直接開啟,我的卻不行),我的方法是在那個連結上按滑鼠右鍵,直接另存新檔,這時匯儲存成一個mht檔,再用IE點開來,打算另存成html新檔後,找出被封裝的圖片。 答:此方法失敗,IE另存新檔不會分離被封裝的圖片檔。 所以只好借重firefox的外掛能力了。 (1) 讓firefox能開啟能開啟mht檔。 Step 1:在firefox的 [工具] – [附加元件]搜尋 unMHT Step 2:安裝後重新啟動firefox (2) 分離封裝的圖片(另存新檔)。 Step 1:開啟mht檔 Step 2:另存新檔,就可以找到相同檔名的資料夾,所有封裝網頁的元件,如圖片、音樂檔都會在裡頭。 完工。