iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 4
0

看看我的瀏覽量,我想RoR相關的文章已經很不被重視了XDD
但我還是照我的Tempo繼續寫下去。

今天,寫下Controller的CRUD function,
記得昨天用scaffold產生出來的一堆檔案嗎?
有一個在app/controllers底下的people_controller.rb有看到嗎!?
http://ithelp.ithome.com.tw/upload/images/20161219/201038351iqT9uOhOI.png
(今天改用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檔~
http://ithelp.ithome.com.tw/upload/images/20161219/20103835pN9K7nmy6J.png

最後最後,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囉!!


上一篇
Day 3, MVC 跟 scaffold
下一篇
Day 5, 最後的RR,Rails routing
系列文
RRRR的世界 (Ruby on Rails + React + Redux)30

尚未有邦友留言

立即登入留言