iT邦幫忙

2022 iThome 鐵人賽

DAY 22
0
Modern Web

Ruby新手村的礦工日記系列 第 22

[ Day 22 ] Rails 中的 Controller 跟 View !!

  • 分享至 

  • xImage
  •  

前幾章我們已經認識Route 了,當你去跟 Route 說你要去哪時,它會指引你該去哪裡,這邊先幫大家複習一下這一張圖:
MVC
它會叫你先去找你要的 Controller ,今天就要來介紹它!

Controller 的工作

Controller 可以翻譯成「控制器」,字面上就可以知道,它是控制流程用的。
有時可能需要跟 Model 要資料,有時也需要把東西給 View 讓使用者看到他想要的資料,或是需要存取外部服務(例如金流串接)等,這些都是 Controller 的工作範疇。

命名慣例

通常在 Rails 中,Controller 的命名慣例是最後一個單字以複數結尾,像是 UsersControllerArticlesController

路徑跟 Controller 的關係

前幾章有提到有關路徑設計,像是:

Rails.application.routes.draw do
  resources :posts
end

並產生以下路徑:
posts
如果沒有特定的 Resources 的 controller 的話,它會對應到的 Controller 會去找 PostsController 的複數型態。
如果是單數 resource 他對應到的就會是單數的 Controller ,會長這樣 PostController

讓我們動手做!

我們這邊實際如何去建立 routes 、 controller 、view 吧!

建立 controller

我們先在終端機建立一個controller,當然也可以手動建立。

$ rails generate controller posts

如果不想打這麼多字,你也可以這樣寫:

$ rails g controller posts

那它會長出什麼檔案呢?
files
可以看到它會幫你做這一系列的檔案,其中有一個 posts_controller.rb ,點這個檔案近去看看吧!

class PostsController < ApplicationController
end

你會發現裡面有一個類別叫做 PostsController 並繼承 ApplicationController ,這時候要注意它的檔名跟類別名稱是不同的,檔名是蛇式命名,類別是大駝峰命名,這邊要稍微注意一下。

正確的錯誤訊息!

當我們在終端機輸入 rails s 也就是開啟伺服器,你可以看到以下的圖片:
rails home
當你在網址上面輸入 http://127.0.0.1:3000/posts 你會去看到這個這樣的畫面:
index 錯誤訊息
看到這個別緊張,它是告訴你目前 PostsController 內沒有 index 這個 action 。
舉例來說:
當你到了服務台 (routes),服務人員告訴你要到三樓 (controller) 找 A 櫃檯,當你到了三樓你才發現根本沒有 A 櫃檯 (action) 。
我們稱這個為正確的錯誤訊息!

給他 action

既然沒有 action,那就做一個給他吧!

class PostsController < ApplicationController
  def index
  end
end

當你輸入以上的程式碼之後,又出現這樣的錯誤訊息:
view 錯誤訊息
你一定會想,我已經給了 action 為什麼還出現錯誤訊息?
也別緊張,這也是正確的錯誤訊息。
舉例來說:
你已經到了 A 櫃檯,但是 A 櫃檯沒有人 (view)。
所以跟剛剛一樣,沒有 view 就給他吧!

給他 view

那要怎麼給他 view 呢?
controller 會根據你給的 action 去找相同名稱的檔案,所以我們要去 app/views/posts 去新增一個 index.html.erb,如下:
index view
這邊解釋一下 html.erb 這個檔案。
簡單來說,他是一個可以在裡面同時寫 html 標籤及 Ruby 語法的檔案。
所以我們在這個檔案添加

<h1>我是 PostsController 中的 index !!!</h1>

這時候,重新整理網頁:
index 畫面
當出現這個畫面,恭喜你已經完成了第一步!!

Params 參數

我們來看看要怎麼傳參數給 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 的方式印出來,如下:
params index JSON
但我只想要 name 參數:

class PostsController < ApplicationController
  def index
    render json: params["name"]
  end
end

這樣就會把 name 整理出來給你,如下:
index params name
不管是 GET 或 POST 傳過來的參數,都會存在 params Hash 中。

參考資料:

  1. 為你自己學 Ruby on Rails
  2. Rails Guides

上一篇
[ Day 21 ] Rails : 迷路了?先問問 Route 吧!(下)
下一篇
[ Day 23 ] Rails 中的 Model 基本與 CRUD (上)
系列文
Ruby新手村的礦工日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言