現在新增都可以順利完成了,
我們現在就可以來做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 %>
那有沒有發現一件事情edit
跟 new
裡面的內容幾乎都長一樣呢?
沒錯,既然都長得差不多,以一個優秀的程式設計來說,
重複用到的東西就會寫成一個,然後一起提用!
那我們就另外創建一個 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