Cập nhật bài viết trong ruby on rails

Lượt xem: 1509

Chúng ta đã đề cập đến "CR" của CRUD. Bây giờ hãy chuyển sang chữ "U" (Update). Việc cập nhật thông tin bài viết rất giống với việc thêm mới bài viết. Cả hai đều là quy trình gồm nhiều bước. Trước tiên, người dùng yêu cầu một biểu mẫu (form) để chỉnh sửa dữ liệu. Sau đó người dùng gửi biểu mẫu (submit form). Nếu không có lỗi, thì bài viết được cập nhật. Ngược lại, biểu mẫu được hiển thị lại với các thông báo lỗi và quá trình này được lặp lại.

Các bước này thường được xử lý bởi các hành động (action) edit (chỉnh sửa) và  update (cập nhật) của controller (bộ điều khiển). Tiếp theo trong controller app/controllers/articles_controller.rb chúng ta sẽ bổ sung thêm 2 action edit và update như sau:


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, status: :unprocessable_entity
    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, status: :unprocessable_entity
    end
  end

  private
    def article_params
      params.require(:article).permit(:title, :body)
    end
end

Lưu ý cách các action edit  và update và giống với action new và create. 

Action edit  tìm nạp bài viết từ cơ sở dữ liệu và lưu trữ nó trong @article để nó có thể được sử dụng khi xây dựng biểu mẫu. Theo mặc định action edit sẽ kết xuất app/views/articles/edit.html.erb.


<h1> Edit Article</h1> 

<%= 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 %> 

Action update tái tìm nạp bài viết từ cơ sở dữ liệu và cố gắng cập nhật bài viết đó với dữ liệu biểu mẫu đã gửi được lọc bởi article_params. Nếu không có xác thực nào thất bại và cập nhật thành công, hành động này sẽ chuyển hướng trình duyệt đến trang của bài viết. Nếu không, hành động sẽ hiển thị lại biểu mẫu với thông báo lỗi bằng cách hiển thị app/views/articles/edit.html.erb

Video thao tác cùng dandev