0
0

More than 1 year has passed since last update.

管理者 商品詳細ページ

Posted at

:star2: 管理者の商品詳細ページの作成

bootstrap導入済 
namespases使用


:shamrock:コントローラー作成

アイテムを一つ取得して@item に格納

admin/items_controller.rb
ef show
   @item = Item.find(params[:id])
 end

:shamrock: views 詳細ページ作成

abmin/items/show.html.erb
<div class="container">
  <h2 class="text-center my-5">商品詳細</h2>
  <div class="row justify-content-center">
    <div class="col-md-6">
      <div style="padding-left:20%;">
        <%= image_tag url_for(@item.image), class: 'img-fluid', style: 'width: 65%;' %>
      </div>
    </div>
    <div class="col-md-6">
      <p class="my-4"><strong>商品名 </strong><span style="margin-left:150px;"><%= @item.name %></span></p>
      <p class="my-4"><strong>商品説明 </strong><span style="margin-left:135px;"><%= @item.description %></span></p>
      <p class="my-4"><strong>税込価格(税抜価格) </strong><span style="margin-left:40px;"><%= number_with_delimiter((@item.price * 1.1).round) %>円 ( <%= number_with_delimiter(@item.price) %>円 )</span></p>
      <p class="my-4"><strong>販売ステータス </strong><span style="margin-left:90px; color:green;"><%= @item.on_sale? ? '販売中' : '販売停止中' %></span></p>
      <%= link_to '編集する', edit_admin_item_path(@item), class: 'btn btn-success' %>
    </div>
  </div>
</div>

:star:div class="container
ページ全体を包むコンテナで、Bootstrapのクラスを利用しています。
:star:class="text-center my-5"
見出しのテキスト("商品詳細")を中央に配置し(text-center)、上下のマージンを設定(my-5)しています。

:star:商品の画像と詳細情報(名前、説明、価格、ステータス)は2つのカラム(col-md-6)に分けて表示されます。このカラムはBootstrapのグリッドシステムを利用しています。

:star:<%= image_tag url_for(@item.image), class: 'img-fluid', style: 'width: 65%;' %>
商品画像を表示します。画像は65%の幅で表示し、img-fluid クラスによってレスポンシブ対応になります。

:star:商品詳細情報(名前、説明、価格、ステータス)は p タグ内に表示されます。<%= @item.name %> のように、@item オブジェクトの属性をERBタグを使用して表示しています。これにより、対応する商品の情報が動的に表示されます。

:star:価格については、number_with_delimiter メソッドを用いて3桁ごとにカンマを挿入し、見やすくしています。

:star:販売ステータス は @item.on_sale? メソッドで状態を確認し、結果に応じて '販売中' または '販売停止中' を表示しています。


:cherry_blossom: 補足

:star:ステータスの'販売中' を選択をしているのに '販売停止中'の表示になってしまう
(@item.on_sale?)を指定しているにもかかわらず判定されていない

現在のCreateItemsマイグレーションでは、itemsテーブルにname, description, price, is_active, そしてtimestampsの5つのカラムが存在するように作られています。しかし、これにはstatusというカラムが含まれていません。

ですので、以下のようにstatusカラムを作成します。

 create_table "items", force: :cascade do |t|
    t.string "name", null: false
    t.text "description", null: false
    t.integer "price", null: false
    t.boolean "is_active", default: true, null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
+   t.integer "status", default: 0
  end

一方、Itemモデルではstatusという名前のenumが定義されています。enumは一連のシンボル(今回の場合はon_saleとoff_sale)を整数にマッピングします。Railsはこれらのシンボルを使用して便利なメソッド(on_sale?, off_sale?など)を生成します。ただし、これらのenumはstatusという名前のカラムに依存しているため、そのカラムがテーブルに存在していなければ、正しく機能しません。

ですから、まずはitemsテーブルにstatusというカラムを追加する必要があります。これを行うために新しいマイグレーションファイルを作成します。

rails generate migration AddStatusToItems status:integer

マイグレーションファイルは以下のようになります。

class AddStatusToItems < ActiveRecord::Migration[6.1]
  def change
    add_column :items, :status, :integer, default: 0
  end
end

:star:これはitemsテーブルにstatusという名前のinteger型のカラムを追加し、そのデフォルト値を0に設定するというマイグレーションです。

rails db:migrate

:dango: 完成イメージ
スクリーンショット 2023-07-19 23.09.00.png

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