看看我的瀏覽量,我想RoR相關的文章已經很不被重視了XDD
但我還是照我的Tempo繼續寫下去。
今天,寫下Controller的CRUD function,
記得昨天用scaffold產生出來的一堆檔案嗎?
有一個在app/controllers底下的people_controller.rb有看到嗎!?
(今天改用Atom編輯器編輯)
打開先看到第二行!
before_action :set_person, only: [:show, :edit, :update, :destroy]
在任何呼叫到show, edit, update, destroy action之前 都先執行 set_person 這個 function,這function在最下面private區塊
def set_person
@person = Person.find(params[:id])
end
從參數(param)中取得 id,然後到Person Model裡找到對的人(是對應id的人,不是Mr. Right),接著Assign給@person變數,所以會看到show, edit, update, destroy裡有沒看過的@person變數,就是在set_person指定的。
接著呢,很快看一下很簡短的四個action: index, show, new, edit:
# GET /people
# GET /people.json
def index
@people = Person.all
end
# GET /people/1
# GET /people/1.json
def show
end
# GET /people/new
def new
@person = Person.new
end
# GET /people/1/edit
def edit
end
這四個就是網址列在輸入http://localhost:3000 ,並接上Get後面那串,會執行的action,簡單來說就是把@person (或index中的@people)呈現在頁面上。
哪個頁面?Views裡的同樣名稱的html.erb檔~
最後最後,create, update, destroy!
# POST /people
# POST /people.json
def create
@person = Person.new(person_params)
respond_to do |format|
if @person.save
format.html { redirect_to @person, notice: 'Person was successfully created.' }
format.json { render :show, status: :created, location: @person }
else
format.html { render :new }
format.json { render json: @person.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /people/1
# PATCH/PUT /people/1.json
def update
respond_to do |format|
if @person.update(person_params)
format.html { redirect_to @person, notice: 'Person was successfully updated.' }
format.json { render :show, status: :ok, location: @person }
else
format.html { render :edit }
format.json { render json: @person.errors, status: :unprocessable_entity }
end
end
end
# DELETE /people/1
# DELETE /people/1.json
def destroy
@person.destroy
respond_to do |format|
format.html { redirect_to people_url, notice: 'Person was successfully destroyed.' }
format.json { head :no_content }
end
end
他們為什麼比較長?純粹只是要判斷接到的type(所以format有分html來的還是json來的),以及用if多一些error handling。
是不是看到了一個沒看過的東西person_param? 阿~他在下面private的地方啦
# Never trust parameters from the scary internet, only allow the white list through.
def person_params
params.require(:person).permit(:name, :bio)
end
從HTTP request的參數裡只抓取我們需要的部分:person裡的name 跟 bio,確保丟進資料庫的資料是安全的。
然後create裡就是針對name跟bio做新增(person.save),update裡就是對對應的id做name與bio的更新。destroy就是刪除囉~
這樣子粗略地講完了CRUD,明天會講最後的Rails routing,就結束前兩個R囉!!