分享

[Rails][notes] CRUD -U: Update官網閱讀紀錄[4]

記錄自己官網文件閱讀的注釋與筆記
主要也是訓練自己閱讀英文挑戰
https://guides.rubyonrails.org/getting_started.html
官網 文件 注釋 筆記 getting

6.4 Updating an Article

目前已經完成了CRUD中的C跟R,現在我們要進行Update,Update與Create是很類似的,他們都是一個多步驟的處理,第一步是使用者要透過表單要求編輯資料,然後使用者要submit這個表單,如果這些動作沒有錯誤,
將執行更新表單,如果要有錯誤將提出錯誤訊息並重複上述過程。
而這些動作將由controller 中的edit and update action 中執行,
接著我們將在app/controllers/articles_controller.rb 添加這兩個action
  

class ArticlesController < ApplicationController

  def index

    @articles = Article.all

  end


  def show

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

  end


  def new

    @article = Article.new

  end


  def create

    @article = Article.new(article_params)


    if @article.save

      redirect_to @article

    else

      render :new

    end

  end


  def edit

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

  end


  def update

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


    if @article.update(article_params)

      redirect_to @article

    else

      render :edit

    end

  end


  private

    def article_params

      params.require(:article).permit(:title, :body)

    end

end

請注意 edit 和update 跟new 和 create 相似
edit 將會先從資料庫找出需要修改的article,然後存入@article 然後使用它建立edit 表單 然後edit action 會渲染到app/views/articles/edit.html.erb
update 則是在一次從資料庫找出需要修改的article,然後嘗試將article_params過濾後的資料更新到資料庫,若是驗證沒有出錯則儲存
更新資料並且轉業回編輯頁面,若是有錯則將錯誤訊息渲染回表單頁面。

6.4.1 Using Partials to Share View Code


我們的edit 表單與new表單是一樣的,所以其程式碼也是相同,因此我們可以透過建立app/views/articles/_form.html.erb 並把相同的程式放在這個檔案
讓new 及edit共用而Rails 將會透過路徑參數自動判別生成表單
  

<%= form_with model: article do |form| %>

  <div>

    <%= form.label :title %><br>

    <%= form.text_field :title %>

    <% article.errors.full_messages_for(:title).each do |message| %>

      <div><%= message %></div>

    <% end %>

  </div>


  <div>

    <%= form.label :body %><br>

    <%= form.text_area :body %><br>

    <% article.errors.full_messages_for(:body).each do |message| %>

      <div><%= message %></div>

    <% end %>

  </div>


  <div>

    <%= form.submit %>

  </div>

<% end %>


而在原本的表單中使用@article 共用form 中我們將其改為article
這個方法將表單需要使用的 @article 變得更靈活,可以讓使用者在
引用這個表單識決店要傳入的引述,而不是綁死在控制器上面
app/views/articles/new.html.erb 改為使用
  

<h1>New Article</h1>


<%= render "form", article: @article %>

在渲然時檔案名稱不用加上_的前綴底線
但是form 檔名存檔時需要添加 _ 前綴
_form.html.erb

6.4.2 Finishing Up

現在我們可以透過http://localhost:3000/articles/1/edit 更新資料
我們可以從show頁面連到編輯頁面
app/views/articles/show.html.erb:
  

<h1><%= @article.title %></h1>


<p><%= @article.body %></p>


<ul>

  <li><%= link_to "Edit", edit_article_path(@article) %></li>

</ul>

6.5 Deleting an Article

接著我們要製作 CRUD 的D,刪除資料比創建跟更新來得簡單許多,只需要一個路徑跟一個Controller action 。路徑的部分resources :articles已經幫我們處理好了,對應到的是DELETE /articles/:id 需要建立一個destroy 的action
讓我們在update下方建立destroy action
  

class ArticlesController < ApplicationController

  def index

    @articles = Article.all

  end


  def show

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

  end


  def new

    @article = Article.new

  end


  def create

    @article = Article.new(article_params)


    if @article.save

      redirect_to @article

    else

      render :new

    end

  end


  def edit

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

  end


  def update

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


    if @article.update(article_params)

      redirect_to @article

    else

      render :edit

    end

  end


  def destroy

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

    @article.destroy


    redirect_to root_path

  end


  private

    def article_params

      params.require(:article).permit(:title, :body)

    end

end

透過路徑參數在資料庫找到需要刪除的article並透過destroy刪除
然後將頁面重新導向到首頁,現在我們可以在show頁面添加刪除連結
  

<h1><%= @article.title %></h1>


<p><%= @article.body %></p>


<ul>

  <li><%= link_to "Edit", edit_article_path(@article) %></li>

  <li><%= link_to "Destroy", article_path(@article),

                  method: :delete,

                  data: { confirm: "Are you sure?" } %></li>

</ul>

我們透過link_to 連結到destroy action ,並在連結中添加method: :delete
使連結提出要求時採用DELETE 而不是GET,data: { confirm: "Are you sure?" } 會提出一個確認 若按下確認就會刪除資料,若按下取消這個刪除動作,這兩個動作都是透過Rails 提供的Unobtrusive JavaScript (UJS) 產生。
這樣我們就可以對文章創建 讀取 修改 刪除等動作。
#官網  #文件  #注釋  #筆記  #getting 
分類:學習

評論
上一篇
  • [Rails][notes] CRUD -C: Create官網閱讀紀錄[3]
  • 下一篇
  • [Rails][notes] Second Model官網閱讀紀錄[5]
  • 更多文章
    載入中... 沒有更多了