LoginSignup
0
1

More than 3 years have passed since last update.

enumを使用して投稿の公開設定をする(二択式)

Last updated at Posted at 2020-11-20

はじめに

やりたいこと

  • 投稿機能に公開ステータスを持たせる
  • デフォルトは非公開にする
  • 公開設定をセレクトボタンで選択させる

 やってみて

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(配列を返すメソッド)の形で呼び出します。

実装例

投稿画面

画面収録 2020-11-20 16.42.42.mov.gif

DB

スクリーンショット 2020-11-20 16.44.41.png

数字で保存される

呼び出し方

公開記事だけをインスタンス変数に含める

controllers/item_controller.rb
class ItemsController < ApplicationController

  def index
    @items = Item.open.order('created_at DESC')
  end

end

おわりに

今回はenumを使用して二択のセレクトボックスからDBに保存する形を実践しました。
今後はより多くの選択肢を与えたり、enumを使用して検索・確認・更新などの機能を実装してみたいなと思います。

✔︎

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1