はじめに
bootstrap導入済
namespases使用
devaice導入済
itemモデル genleモデル 作成済
商品登録ページ作成済
完成イメージ
ジャンル一覧・ジャンル登録(indexページ)
ジャンル更新ページ(edit)
モデル設定
ジャンルモデル追加
$ rails g model Genre name:string
$ rails db:migrate
1つのジャンルが多数のアイテムを持っている
以下を追加
has_many :genles
belongs_to :item, optional: true
class Genre < ApplicationRecord
validates :name, presence: true
end
上記のように、指定するとジャンル名が必須になるようにバリデーションを設定することができます。
(今回は指定していません)
コントローラー
admin/genresコントローラー作成
$ rails g controller admin/genres
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ページ
ジャンル一覧・ジャンル登録(indexページ)
<% 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>
ジャンル更新ページ
<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を用いてフォームを作成し、ジャンル名を入力できるようにしています。
商品登録の際ジャンルを指定できるようにする
商品登録のページにドロップダウン形式でジャンルを指定できるようにしました。
<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>