iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
自我挑戰組

Ruby on Rails JS系列 第 16

Ruby on Rails Controller

第 1 步 - 新增 Route
別忘了,使⽤者想要看到你網站上的內容,第⼀步是要問過 Route,所以我們先在
Route 上簡單的加上⼀條:

Rails.application.routes.draw do
get "/hello_world", to: "pages#hello"
resources :posts
12 Controller
169
resources :users
end

當使⽤者輸入 /hello_world 網址的時候,會交給 PagesController 的
hello ⽅法處理。(是的,其實網址跟 Controller 上的 Action 不⼀定要同名)
第 2 步 - 把⽂字印出來吧!
有了 Route 之後,接下來回到 Controller 把 hello 這個 Action 加上去:

class PagesController < ApplicationController
def hello
render plain: "<h1>你好,世界!</h1>"
end
end

在 hello ⽅法裡要把⽂字輸出到瀏覽器上,不是使⽤ return 也不是使⽤
puts ,⽽是使⽤ render ⽅法,後⾯的 plain 參數是指要輸出⼀個⼀般的⽂
字內容到畫⾯上。
有些剛開始學 Rails 的新朋友可能會想這樣做:

class PagesController < ApplicationController
def hello
render plain: "<h1>你好,世界!</h1>"
puts "---- 你好 ----"
end
end

使⽤ puts ⽅法把資料直接輸出在畫⾯上,看起來很直覺,但這樣不會有效果。事
實上並不是 puts ⽅法不能⽤,它的確可以把東⻄印出來,只是不是印在瀏覽器上
給你看到,⽽是印在 Rails 的 log 裡,仔細看⼀下正在執⾏ rails server 的那個
畫⾯是不是有這樣的東⻄:

第 3 步 - 把⼯作交給 View 吧
雖然在第 2 步可以直接在 Controller 的 Action 裡透過 render ⽅法把資料輸出在
畫⾯上,但如果遇到比較複雜的 HTML 通常就不會⽤這個⽅式了。在 Controller 裡
的 Action,如果沒有特別指定 render ⽅法或參數,它會到 app/views/ 的⽬錄
找「 Controller 名字」⽬錄裡的 Action 同名檔案。以這個例⼦來說,它會去找
app/views/pages/hello.html.erb 。
如果這個 hello.html.erb 檔案不存在,就⾃⼰⼿動建⼀個吧。既然輸出的事情
交給 View,那原來 hello 這個 Action 的 render ⽅法就可以拿掉:

class PagesController < ApplicationController
12 Controller
171
def hello
end
end

就這樣空空的,然後編輯 app/views/pages/hello.html.erb

<h1>你好,世界</h1>
<h2>我是設計師也看得懂的檔案喔</h2>

重新整理,應該就會看到跟剛才的差別:
這樣的好處是不⽤把 HTML 都寫在 Controller 裡(實務上也很少⼈真的會這麼
做),再來就是要跟設計師合作的時候也比較⽅便。

參考資料

[為你自己學Ruby on Rails]https://railsbook.tw/chapters/08-ruby-basic-4.html


上一篇
Ruby on Rails Controller 是幹嘛的
下一篇
Ruby on Rails Model 基本操作之 CRUD CRUD 之 C(Create)
系列文
Ruby on Rails JS29

尚未有邦友留言

立即登入留言