【Rails6】Boolean型のtrueとfalseの切り替えボタンを作成する方法

Boolean型のtrueとfalseの切り替えボタンを作成する方法

Rails6でBoolean型のtrueとfalseの切り替えボタンを作成する方法です。

現状の条件として、投稿機能があることを前提に進めます。

Boolean型のカラムを追加するときは必ずデフォルト値を設定

まずは、finishedというカラム名でBlooean型を追加します。

$ rails g migration AddFinishedToPosts finished:boolean

migrationファイルが生成されるので、default: false, null: falseを追加します。

理由は、デフォルトでfalseに設定しておくのと、NULL が入ると面倒な問題を引き起こしやすいので基本的に付けておくことをオススメします。

class AddFinishedToPosts < ActiveRecord::Migration[6.1]
  def change
    add_column :posts, :finished, :boolean, default: false, null: false
  end
end
$ rails db:migrate

これで、finishedカラムの追加が完了です。

データベースを確認します。

+----+------------------+-----------------+-----------------+------------------+------------------+---------+----------+------------------+
| id | title            | content         | created_at      | updated_at       | public_uid       | user_id | finished | tag_list         |
+----+------------------+-----------------+-----------------+------------------+------------------+---------+----------+------------------+
| 1  | タイトルテス...  | \r\n### 前提... | 2021-01-03 0... | 2021-01-03 02... | a423cd6675368... | 1       | false    |                  |
| 2  | タイトルテス...  | \r\n### 前提... | 2021-01-03 0... | 2021-01-03 02... | cb5aa54445956... | 1       | false    |                  |

finishedカラム を確認すると、falseがデフォルトになっていることが確認できます。

viewに反映させる

<%= post.finished ? '解決済み' : '回答受付中' %>

今回は、投稿が解決済み(true)の場合と回答受付中(false)の場合に分けます。

trueとfalseの切り替えボタンを作成

<% if @post.finished %>
  <%= link_to '回答受付中に戻す', post_path(@post.id, post: {finished: false}), method: :put %>
<% else %>
  <%= link_to '解決済みにする', post_path(@post.id, post: {finished: true}), method: :put %>
<% end %>

こうしてあげることで、リンクをクリックするたびに、「投稿が解決済み(true)と回答受付中(false)の切り替え」ができるようになります。

def update
  @post = Post.find(params[:id])
  if @post.update(post_params)
    flash[:notice] = "編集できました"
    redirect_to post_path(@post.public_uid)
  else
    render 'edit'
  end
end

コントローラーは上記のようになっています。(色々といじっているので、各自記述変更が必要な場合もあります。)

他にもこんな記事があります!