Ruby on rails controller

寫了Routes之後

1
2
3
4
5
Rails.application.routes.draw do

resources :articles

end

現在來建立一個controller
依照Ruby on rails的慣例,當初Routes怎麼命名的,Controller就怎麼命名
這邊是articles做範例

在終端機輸入指令

1
$rails g controller articles

在controllers/
就會生成articles_controller.rb這個檔案

相反地,如果要刪除controller,使用以下指令

1
$rails d controller 名稱

controller

剛剛建立controller articles如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class ArticlesController < ApplicationController
# before_action可以針對某幾個action的部分, 先執行set_article方法以及set_user_article方法;這些自己定義的方法寫在private底下
before_action :set_article, only:[:show, :edit, :update, :destroy]

def index
# 使用實體變數@articles,讓所有的文章可以呈現在index頁面
# desc是新文章到舊文章排序;預設asc是舊到新排序
@articles = Article.order(id: :desc)
end

def new
# 在new的方法裡面,做實體變數@article,連動實體變數
@article = Article.new
end

def create
# 自己不需要view,借別人頁面使用,實體變數@articles,可以將@articles的資料呈現
@article = Article.new(article_params)

# 寫入資料庫裡面,存入資料庫成功的話,給一個視窗提醒使用者"文章新增成功"
if @article.save
redirect_to "/articles"
flash[:notice] = "文章新增成功"
else
# 存入資料庫失敗的話,把new頁面渲染出來,填寫過的資料欄位會保留在頁面上
render :new
end
end

def show
# 要找到該文章的id
end

def edit
# 要找到該文章的id
end

def update
# 自己不需要view
# 先找到該文章的id,找到之後,更新文章裡面的資料

if @article.update(article_params)
# 更新成功的話,給一個視窗提醒使用者"更新成功"
redirect_to articles_path, notice: '更新成功'
else
# 更新失敗的話,把new頁面渲染出來,填寫過的資料欄位會保留在頁面上
render :edit
end

end

def destroy
# 自己不需要view
# 要找到該文章的id,找到之後,刪除該文章
@article.destroy
redirect_to articles_path, notice: '刪除成功'
end

private

def article_params
params.require(:article)
.permit(:title, :sub_title, :content)
end

def set_article
@article = Article.find(params[:id])
end

end


:show, :edit, :update, :destroy這些Action
都需要做@article = Article.find(params[:id]),找文章id的動作一直重複做
所以我們自己做了一個方法叫set_article,在多個Action共享相同的邏輯
另外
這方法放在private底下,只能在ArticlesController這個類別使用,避免被其他的controller