はじめに
やりたいこと
- 投稿機能に公開ステータスを持たせる
- デフォルトは非公開にする
- 公開設定をセレクトボタンで選択させる
やってみて
enum自体は非常に奥が深いモジュールだと感じましたが、私がやりたいことは簡単に実装できました。
ですので、この投稿は初心者でもすぐに実践できる内容になっていると思います。
参考
Rails公式リファレンス
Pikawaka <【Rails】enumチュートリアル
手順
DB設計
db/migrate/create_item.rb
class CreateItems < ActiveRecord::Migration[6.0]
def change
create_table :items do |t|
t.string :title, null: false
t.string :tagbody
t.string :url
t.text :body, null: false
# statusカラム、integer型、deroult: 0 を指定
t.integer :status, null: false, default: 0
t.integer :category_id, null: false
t.references :user, foreign_key: true
t.timestamps
end
end
end
boolean型で作成することもできますが、2個以上の定数と紐付けたい場合はinteger型を選択。
Model
models/item.rb
enum status: { closed: 0, open: 1 }
デフォルトを非公開にするので「closed」という定数を「0」に設定しました。
Controller
通常通りストロングパラメーターとcreateアクションを定義します。
controllers/items_controller.rb
class ItemsController < ApplicationController
def create
@item = Item.new(item_params)
if @item.save
redirect_to root_path
else
render :new
end
end
private
def item_params
params.require(:item).permit(:title, :tagbody, :body, :url, :status, :category_id).merge(user_id: current_user.id)
end
end
View
formの書き方
views/items/new.html.erb
<%= form_with model:@item, url: '/items', local: true do |f| %>
<%= f.select :status, Item.statuses.keys.to_a, {}, { class:'item-open' } %>
<% end %>
解説
f.selectの使い方
<%= f.select 属性, 選択肢の集合, {オプション}, {HTMLオプション} %>
Item.statuses.keys.to_a について
enumで指定した定数はハッシュの形で配列になっています。
したがってstatuses(複数形).keys.to_a(配列を返すメソッド)の形で呼び出します。
実装例
投稿画面
DB
数字で保存される
呼び出し方
公開記事だけをインスタンス変数に含める
controllers/item_controller.rb
class ItemsController < ApplicationController
def index
@items = Item.open.order('created_at DESC')
end
end
おわりに
今回はenumを使用して二択のセレクトボックスからDBに保存する形を実践しました。
今後はより多くの選択肢を与えたり、enumを使用して検索・確認・更新などの機能を実装してみたいなと思います。
✔︎