ジャンル登録機能実装

はじめに
bootstrap導入済　
namespases使用
devaice導入済
itemモデル　genleモデル　作成済
商品登録ページ作成済
________
完成イメージ
ジャンル一覧・ジャンル登録(indexページ）
![スクリーンショット 2023-07-23 13.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/f4691ccf-e93e-3ec9-e91e-32c068552689.png)
ジャンル更新ページ(edit)
![スクリーンショット 2023-07-23 13.49.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/46847e7e-69ab-a644-7453-7046e766c7cf.png)

### モデル設定
ジャンルモデル追加
```
$ rails g model Genre name:string
$ rails db:migrate
```
１つのジャンルが多数のアイテムを持っている
以下を追加
```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ページ）**
```erb: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:**ジャンル更新ページ**
```erb: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:**商品登録の際ジャンルを指定できるようにする**
商品登録のページにドロップダウン形式でジャンルを指定できるようにしました。
```erb: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>
  ```