iT邦幫忙

DAY 9
1

從想法到快速實作的捷徑:Rails系列 第 9

[ Day 9 ][ Dev ] 從開發Po文功能認識MVC #2 新增一則po文

  • 分享至 

  • xImage
  •  

其實理想中的規劃應該是要將M, V, C都拆開來講的,

但實際上controller如果沒有view來輔助解釋,其實有一點太抽象,

所以今天會有基本的view來輔助。

我們要做的不僅是po文功能,

而是最基本的CRUD,在rails裡面有很制式的做法告訴我們該怎麼去實作CRUD。

  • CRUD就是create read update delete:
  1. Create: 顧名思義就是新增,比如說我們新增一篇文章,就是屬於create。

  2. Read:可以看的到,就是read。(應該沒辦法想像沒辦法read的網站吧)

  3. Update:更新,是對現有的東西做改變。

  4. Delete:刪除,將現有的東西刪除掉。

仔細想一下,會發現平常在網路上做的基本事情都不脫這四個。

關於Crud的參考資料

http://ihower.tw/rails3/basic.html

http://rails101s.logdown.com/posts/210435

先回顧一下我們現在有什麼:

  • Post的model

Post的屬性:

(屬性: 資料形態)

  • title: string
  • content: text
  • note: string
  • source: string

接著就要開始製造我們的controller啦!

第一步當然是要先有一個post的controller,

rails g controller posts

注意:controller的名稱是用複數 可以參考這裡:

http://guides.rubyonrails.org/action_controller_overview.html#controller-naming-convention

接著你會想到臥草每次作CRUD都要在routes.rb裡面加一堆東西是不是很麻煩?

不用擔心,因為這些路徑實在太常用了,已經有先賢先烈幫我們解決這問題,

現在只要寫一行就可以解決所有CRUD所需要的路徑了:

resources :posts

可以輸入bundle exec rake routes來看現在有哪些路徑:

Prefix Verb   URI Pattern               Controller#Action
     root GET    /                         home#index
    posts GET    /posts(.:format)          posts#index
          POST   /posts(.:format)          posts#create
 new_post GET    /posts/new(.:format)      posts#new
edit_post GET    /posts/:id/edit(.:format) posts#edit
     post GET    /posts/:id(.:format)      posts#show
          PATCH  /posts/:id(.:format)      posts#update
          PUT    /posts/:id(.:format)      posts#update
          DELETE /posts/:id(.:format)      posts#destroy

除了先前設置的首頁之外,其他就是剛剛產生的posts路徑,我們可以先不用管路徑的事情放心用啦!

(之後可能還是會需要有其他客製化的route,resources堪用,但不能永遠只依靠他。)

這裡把我們要做的action一項一項列出來,而這也是我們開發的順序,稍後就會明白為何這樣編排:

  • show
  • new
  • create
  • edit
  • update
  • index
  • destroy

首先我們要做的是show這個action,他裡面包含的是所有的posts

這裡的命名是有一定規則的,當專案越來越大時越會體會到這樣的好處,

不僅是命名有了一致性,找頁面也會變得方便很多,

後面會講到其實可以render跟action不一樣名字的頁面(但我不喜歡這樣)。

class PostsController < ApplicationController

  def show
    @posts = Post.find(params[:id])
  end

end
  • params[:id]就是我們在瀏覽器網址列上最後方post的id,可以暫時先把這當成大自然的法則。

  • 所以show頁面會找出id == params[:id]的post

接著是陽春的show.html.erb,放的位置是:app/views/posts/

<h1><%= @post.title %></h1>
<p><%= @post.content %></p>

<div class="source">
  <p><%= @post.source %></p>
</div>

<div class="note">
  <p>
    <%= @post.note %>
  </p>
</div>

很明顯的發現我們現在沒有任何的post是可以show出來的,

(這裡可以到rails的console去新建一個po文,不過你應該不會想要老是這樣子做)

所以再來我們要新增一個new action

class PostsController < ApplicationController

  def show
    @posts = Post.find(params[:id])
  end

  def new
    @post = Post.new
  end

end

眼尖的人會發現這裡沒有傳入任何參數,也不會實際去新建什麼東西,

如果你也注意到rake routes裡的結果就會發現new的http method是get,

get通常就是拿來讓使用者瀏覽資訊,不會做出更動的。

(這也就是為什麼待會要有一個是post的create)

在新增我們的new頁面之前得先裝一個叫做simple_form的gem。

以及better_errors這個gem除了顧眼睛之外也對debug很有幫助,
不然老是看到紅色一大片就已經氣急攻心了還寫什麼code

create這邊會比較特別一點,

因為會對資料庫做到改變,所以將會遇到strong parameter的問題,

淺顯一點的講,我們必須要設定能夠傳入的欄位,

比如說這裡的post,我們允許能傳入的就是titile, content, note還有source,

所以使用者在客戶端(瀏覽器)是沒辦法改變post的id或創造時間的,

而去限制和建立新資料的方法會長得像下面這樣:

class PostsController < ApplicationController

  def show
    @posts = Post.find(params[:id])
  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
  end

  private

  def post_params
    params.require(:posts).permit(:title, :content, :note, :source)
  end

end

放在private就只有這個class中的action可以呼叫post_params,也是基於安全。

講完strong parameter剛好可以切一個段落,

因為基本CRUD的實作流程較難理解的部分已經做得差不多了,

剩下的action,除了edit和update跟new, create很像之外,

index和destroy其實也很簡單,

這一篇結束後可以構思以及查一下文章看要如何識做這些action,

下一篇簡短給出解答後,會繼續加前端得連結,完成一個最陽春的po文網站。

(這裡的新增po文功能還要做redirect或是render的處理,這些比較細節的東西會放在下一篇說)


上一篇
[ Day 8 ][ Dev ] 從開發Po文功能認識MVC #1 Post的model
下一篇
[ Day 10 ][ Dev ] 從開發Po文功能認識MVC #3 完成post的CRUD
系列文
從想法到快速實作的捷徑:Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言