Rails で ToDo アプリをつくる⑤ (Rails 入門)

↓の続きです。

utouto97.hatenablog.com

今回やること

今回は、CRUD の U をやっていきます。
ただし、ToDoの編集ではなく、ToDoの状態(status)を変更できるようにしていきます。
現在、'In progress' と 'Complete' の2状態あります。
これらを交互にトグルできるようにします。

基本的にやっていくことは前回と同じです。
ルーティングの設定、コントローラーのアクション追加、ビューを編集といった流れになります。

ルーティングの設定

まず、ルーティングの設定を行います。
以下を追記します。

put '/:id' => 'todos#toggle'

ここでは、PUTメソッドを使いました。
正直なところ、PUTメソッドとPATCHメソッドの使い分けが難しいです。

コントローラーのアクション追加

続いて、コントローラーのアクションを追加します。
ルーティングで設定したtoggleアクションを追加します。

def toggle
  @id = params[:id]
  @todo = Todo.find(@id)
  new_status = @todo.status == 'In progress' ? 'Complete' : 'In progress'
  @todo.update(status: new_status)
  redirect_to :action => 'index'
end

パラメータからidを取得し、対応するToDoを検索します。
あとは、updateメソッドで状態(status)を更新し、indexにリダイレクトしています。

ボタンの追加(ビューの編集)

完了(Complete)ボタンや完了取り消し(Cancel)ボタンは追加していなかったので、ここで追加していきます。
ビューファイルに追記していきます。

<%= link_to (todo.status == 'In progress' ? 'Complete' : 'Cancel'), "/#{todo.id}", method: :put, class: "btn btn-" + (todo.status == 'In progress' ? 'info' : 'secondary') %>

ここでも、Railslink_toを使って書いています。
また、Bootstrapによる装飾も行っています。

これで、ToDoの状態を変更するボタンとその処理を追加できました。

終わり