前幾章我們已經認識Route 了,當你去跟 Route 說你要去哪時,它會指引你該去哪裡,這邊先幫大家複習一下這一張圖:
它會叫你先去找你要的 Controller ,今天就要來介紹它!
Controller 可以翻譯成「控制器」,字面上就可以知道,它是控制流程用的。
有時可能需要跟 Model 要資料,有時也需要把東西給 View 讓使用者看到他想要的資料,或是需要存取外部服務(例如金流串接)等,這些都是 Controller 的工作範疇。
通常在 Rails 中,Controller 的命名慣例是最後一個單字以複數結尾,像是 UsersController
、 ArticlesController
。
前幾章有提到有關路徑設計,像是:
Rails.application.routes.draw do
resources :posts
end
並產生以下路徑:
如果沒有特定的 Resources 的 controller 的話,它會對應到的 Controller 會去找 PostsController
的複數型態。
如果是單數 resource
他對應到的就會是單數的 Controller ,會長這樣 PostController
。
我們這邊實際如何去建立 routes 、 controller 、view 吧!
我們先在終端機建立一個controller,當然也可以手動建立。
$ rails generate controller posts
如果不想打這麼多字,你也可以這樣寫:
$ rails g controller posts
那它會長出什麼檔案呢?
可以看到它會幫你做這一系列的檔案,其中有一個 posts_controller.rb
,點這個檔案近去看看吧!
class PostsController < ApplicationController
end
你會發現裡面有一個類別叫做 PostsController
並繼承 ApplicationController
,這時候要注意它的檔名跟類別名稱是不同的,檔名是蛇式命名,類別是大駝峰命名,這邊要稍微注意一下。
當我們在終端機輸入 rails s
也就是開啟伺服器,你可以看到以下的圖片:
當你在網址上面輸入 http://127.0.0.1:3000/posts
你會去看到這個這樣的畫面:
看到這個別緊張,它是告訴你目前 PostsController
內沒有 index
這個 action 。
舉例來說:
當你到了服務台 (routes),服務人員告訴你要到三樓 (controller) 找 A 櫃檯,當你到了三樓你才發現根本沒有 A 櫃檯 (action) 。
我們稱這個為正確的錯誤訊息!
既然沒有 action,那就做一個給他吧!
class PostsController < ApplicationController
def index
end
end
當你輸入以上的程式碼之後,又出現這樣的錯誤訊息:
你一定會想,我已經給了 action 為什麼還出現錯誤訊息?
也別緊張,這也是正確的錯誤訊息。
舉例來說:
你已經到了 A 櫃檯,但是 A 櫃檯沒有人 (view)。
所以跟剛剛一樣,沒有 view 就給他吧!
那要怎麼給他 view 呢?
controller 會根據你給的 action 去找相同名稱的檔案,所以我們要去 app/views/posts
去新增一個 index.html.erb
,如下:
這邊解釋一下 html.erb
這個檔案。
簡單來說,他是一個可以在裡面同時寫 html 標籤及 Ruby 語法的檔案。
所以我們在這個檔案添加
<h1>我是 PostsController 中的 index !!!</h1>
這時候,重新整理網頁:
當出現這個畫面,恭喜你已經完成了第一步!!
我們來看看要怎麼傳參數給 Controller。
當你輸入這樣的網址:http://127.0.0.1:3000/posts?name=dylan_kacaw
我們在 posts
後面多了 ?
。
雖然畫面上沒什麼變化,但是 ?
後面的東西會被當作參數傳到一個叫做 params
特別的變數。
那我們在 posts
Action 寫一些東西吧!
class PostsController < ApplicationController
def index
render json: params
end
end
這樣他會把 params
這個變數用 JSON
的方式印出來,如下:
但我只想要 name
參數:
class PostsController < ApplicationController
def index
render json: params["name"]
end
end
這樣就會把 name
整理出來給你,如下:
不管是 GET 或 POST 傳過來的參數,都會存在 params Hash 中。
參考資料: