0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ジャンル登録機能実装

Posted at

はじめに
bootstrap導入済 
namespases使用
devaice導入済
itemモデル genleモデル 作成済
商品登録ページ作成済


完成イメージ
ジャンル一覧・ジャンル登録(indexページ)
スクリーンショット 2023-07-23 13.47.36.png
ジャンル更新ページ(edit)
スクリーンショット 2023-07-23 13.49.10.png

モデル設定

ジャンルモデル追加

$ rails g model Genre name:string
$ rails db:migrate

1つのジャンルが多数のアイテムを持っている
以下を追加

item.rb
 has_many :genles
genle.rb
 belongs_to :item, optional: true
genle.rb
class Genre < ApplicationRecord
  validates :name, presence: true
end

上記のように、指定するとジャンル名が必須になるようにバリデーションを設定することができます。
(今回は指定していません)

コントローラー

admin/genresコントローラー作成

$ rails g controller admin/genres
admin/genles_controller.rb

class Admin::GenresController < ApplicationController
  before_action :set_genre, only: [:edit, :update]

  def index
    @genres = Genre.all
    @genre = Genre.new
  end

  def create
    @genre = Genre.new(genre_params)
    if @genre.save
      redirect_to admin_genres_path, notice: "ジャンルを登録しました"
    else
      @genres = Genre.all
      render :index
    end
  end

  def update
    if @genre.update(genre_params)
      redirect_to admin_genres_path, notice: "ジャンルを更新しました"
    else
      render :edit
    end
  end

  private
  def set_genre
    @genre = Genre.find(params[:id])
  end

  def genre_params
    params.require(:genre).permit(:name)
  end
end

newアクションでは新規ジャンルを作成するためのオブジェクトを作成、createアクションではフォームから送られてきたデータを用いてジャンルを保存し、editアクションでは編集するジャンルのオブジェクトを取得、updateアクションではジャンルを更新しています。

viewsページ

:star:ジャンル一覧・ジャンル登録(indexページ)

admin/genles/index.html.erb
<% if flash[:alert] %>
  <div class="alert alert-danger">
    <%= flash[:alert] %>
  </div>
<% end %>
<h1 class="text-center">ジャンル一覧・追加</h1>

<div class="row justify-content-center">
  <div class="col-md-6">
    <%= form_with(model: @genre, url: admin_genres_path, class: 'form-group') do |f| %>
      <%= f.label :name, "ジャンル名", class: 'form-label' %>
      <div class="input-group mb-3">
        <%= f.text_field :name, class: 'form-control', placeholder: 'ジャンル名を入力してください' %>
        <div class="input-group-append">
          <%= f.submit "新規登録", class: 'btn btn-success' %>
        </div>
      </div>
    <% end %>
  </div>
</div>

<div class="row justify-content-center">
  <div class="col-md-8">
    <table class="table table-striped">
      <thead>
        <tr>
          <th>ジャンル名</th>
          <th></th>
        </tr>
      </thead>
      <tbody>
        <% @genres.each do |genre| %>
          <tr>
            <td><%= genre.name %></td>
            <td><%= link_to '編集', edit_admin_genre_path(genre), class: 'btn btn-success' %></td>
          </tr>
        <% end %>
      </tbody>
    </table>
  </div>
</div>

:star:ジャンル更新ページ

admin/genles/edit.html.erb
<h1 class="text-center">ジャンル編集</h1>

<div class="row justify-content-center">
  <div class="col-md-6">
    <%= form_with(model: @genre, url: admin_genre_path(@genre), method: :patch, class: 'form-group') do |f| %>
      <%= f.label :name, "ジャンル名", class: 'form-label' %>
      <div class="input-group mb-3">
        <%= f.text_field :name, class: 'form-control', placeholder: 'ジャンル名を入力してください' %>
        <div class="input-group-append">
          <%= f.submit "更新", class: 'btn btn-success' %>
        </div>
      </div>
    <% end %>
  </div>
</div>

ビューの作成と設定: new.html.erbとedit.html.erbという2つのビューを作成しました。それぞれジャンルの新規作成と編集用のフォームを表示します。これらのビューには、それぞれform_withを用いてフォームを作成し、ジャンル名を入力できるようにしています。


:star:商品登録の際ジャンルを指定できるようにする
商品登録のページにドロップダウン形式でジャンルを指定できるようにしました。

admin/items/new.html.erb
 <div class="form-group row">
    <%= f.label :genre_id, 'ジャンル', class: 'col-sm-3 col-form-label' %>
    <div class="col-sm-9">
      <%= f.collection_select :genre_id, Genre.all, :id, :name, {}, {class: 'form-control'} %>
    </div>
  </div>
0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?