寫了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,使用以下指令
剛剛建立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