【Rails6】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
コントローラーは上記のようになっています。(色々といじっているので、各自記述変更が必要な場合もあります。)