iT邦幫忙

2023 iThome 鐵人賽

DAY 17
1
自我挑戰組

Rails 手工打造自己的部落格 系列 第 17

Rails 手工打造自己的部落格 17 - CRUD -U

  • 分享至 

  • xImage
  •  

現在新增都可以順利完成了,
我們現在就可以來做U- update (編輯更新)
我們把編輯做在show裡面,
連結的路徑跟 new 不一樣的地方就是要給他參數,
讓他知道是要編輯哪一則的文章!

  <%= @article.title %>
  <%= @article.content %>

  <%= link_to '編輯', edit_article_path(@article) %> 

然後我們接著就要做 edit 頁面 !
edit.html.erb
一樣使用表單來呈現

<%= form_with model: @article do |f| %> 
    <h1 class="text-2xl" >更新文章</h1>
    
    <div>
      <%= f.label '標題', :title %> <br>
      <%= f.text_field :title , class:'border-black border-2'%>
    </div>

    <div>
      <%= f.label '內容', :content %><br>
      <%= f.text_area :content, class:'border-black border-2' %>
    </div>

    <div>
      <%= f.submit %>
    </div>

<% end %>

那有沒有發現一件事情
editnew 裡面的內容幾乎都長一樣呢?
沒錯,既然都長得差不多,以一個優秀的程式設計來說,
重複用到的東西就會寫成一個,然後一起提用!
那我們就另外創建一個 view 叫做 _from.html.erb
然後把跟new重複用到的東西都搬進來!
然後我們再 new 跟 edit 裡面使用一個叫做 partial render的動作來呼叫他。

<%= rander 'form' %>

這樣我們就可以成功取用
然後在controller的地方也要給他 @article 的參數,

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

  def update
    @article = Article.find(params[:id])
    if @article.update
      redirect_to article_path(@article), notice: '更新成功'
    else
      render :edit
    end
  end

然後有沒有發現 find(params[:id]) 出現了很多次 ?
我們現在就可以來整理它,
把它寫成一個方法,然後設成 before_action
這樣我們就不需要每個 action 裡面都寫了!

before_action :set_article , only: [:show :edit :update]

  def show
  end

  def edit
  end

  def update
    if @article.update(article_params)
      redirect_to article_path(@article), notice: '更新成功'
    else
      render :edit
    end
  end

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

上一篇
Rails 手工打造自己的部落格 16 - CRUD -R
下一篇
Rails 手工打造自己的部落格 18 - CRUD -D
系列文
Rails 手工打造自己的部落格 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言