学生向けプログラミング入門 | 無料

学生向けにプログラミングを無料で解説。Java、C++、Ruby、PHP、データベース、Ruby on Rails, Python, Django

Rails6.1 | 仕事売買アプリ作成 | 32 | Request

↓↓クリックして頂けると励みになります。


31 | Orderの確認】 << 【ホーム】 >> 【33 | Offer



クライアント(仕事を依頼する人)が自分から仕事をリクエストできるように実装します。

モデル



リクエストモデルを作成します。


コマンド
一文です。
rails g model Request description:text title budget:bigint delivery:bigint user:references category:references


コマンド マイグレーション適用
rails db:migrate


「app\models\request.rb」ファイルの記述を更新します。


記述更新 app\models\request.rb

class Request < ApplicationRecord
  belongs_to :user
  belongs_to :category

  has_one_attached :attachment_file

  validates :title, presence: { message: "空白にはできません" }
  validates :description, presence: { message: "空白にはできません" }
  validates :delivery, numericality: { only_integer: true, message: "数字でなければなりません" }
end



「app\models\category.rb」ファイルに以下の記述を追加します。


記述追加 app\models\category.rb(4行目)

has_many :requests



app\models\category.rb

class Category < ApplicationRecord

    has_many :gigs
    has_many :requests
    
end



「app\models\user.rb」ファイルに以下の記述を追加します。


記述追加 app\models\user.rb(4行目)

has_many :requests



app\models\user.rb

class User < ApplicationRecord

  has_many :gigs
  has_many :requests
  has_many :buying_orders, foreign_key: "buyer_id", class_name: "Order"
  has_many :selling_orders, foreign_key: "seller_id", class_name: "Order"

  has_one_attached :avatar

  validates :full_name, presence: true, length: {maximum: 50}
  
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable,
          :confirmable, :omniauthable

  def self.from_omniauth(auth)
    user = User.where(email: auth.info.email).first

    if user
      return user
    else
      where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
        user.email = auth.info.email
        user.password = Devise.friendly_token[0, 20]
        user.full_name = auth.info.name   # ユーザーモデルに名前があると仮定
        user.image = auth.info.image # ユーザーモデルに画像があると仮定

        user.uid = auth.uid
        user.provider = auth.provider

      end
    end
  end
end


コントローラー



リクエストコントローラを作成します。


コマンド
一文です。
rails g controller Requests index new create edit update show destroy list


「app\controllers\requests_controller.rb」ファイルを以下のように編集します。


記述編集 app\controllers\requests_controller.rb

class RequestsController < ApplicationController
  before_action :authenticate_user!
  before_action :set_request, except: [:new, :create, :index, :list]
  before_action :is_authorised, only: [:edit, :update, :destroy]
  before_action :set_categories, only: [:new, :edit, :list]
 

  def index
    @requests = current_user.requests
  end

  def new
    @request = current_user.requests.build
  end

  def create
    @request = current_user.requests.build(request_params)
    if @request.save
      redirect_to requests_path, notice: "保存しました"
    else
      redirect_to request.referrer, flash: {error: @request.errors.full_messages.join(', ')}
    end
  end

  def edit
  end

  def update
    if @request.update(request_params)
      redirect_to requests_path, notice: "保存しました"
    else
      redirect_to request.referrer, flash: {error: @request.errors.full_messages.join(', ')}
    end
  end

  def show
  end

  def destroy
    @request.destroy
    redirect_to requests_path, notice: "削除しました"
  end

  def list
    @category_id = params[:category]

    if @category_id.present?
      @requests = Request.where(category_id: @category_id)
    else
      @requests = Request.all
    end
  end

  private

  def set_categories
    @categories = Category.all
  end

  def set_request
    @request = Request.find(params[:id])
  end

  def is_authorised
    redirect_to root_path, alert: "あなたに権限はありません。" unless current_user.id == @request.user_id
  end

  def request_params
    params.require(:request).permit(:description, :category_id, :delivery, :budget, :attachment_file, :title)
  end
end


ルート設定



ルートの設定をします。
自動で追加されたものはすべて削除します。


記述追加(2ヶ所) config\routes.rb
12行目に「get '/all_requests', to: 'requests#list'」の記述を追加。
27行目に「resources :requests」の記述追加

Rails.application.routes.draw do

  # ルートを app\views\pages\home.html.erb に設定
  root 'pages#home'
  
  # get
  get 'pages/home'
  get '/dashboard', to: 'users#dashboard'
  get '/users/:id', to: 'users#show', as: 'user'
  get '/selling_orders', to: 'orders#selling_orders'
  get '/buying_orders', to: 'orders#buying_orders'
  get '/all_requests', to: 'requests#list'

  # post
  post '/users/edit', to: 'users#update'

  put '/orders/:id/complete', to: 'orders#complete', as: 'complete_order'

  resources :gigs do
    member do
      delete :delete_photo
      post :upload_photo
    end
    resources :orders, only: [:create]
  end

  resources :requests

  # device
  devise_for :users, 
    path: '', 
    path_names: {sign_up: 'register', sign_in: 'login', edit: 'profile', sign_out: 'logout'},
    controllers: {omniauth_callbacks: 'omniauth_callbacks', registrations: 'registrations'}
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end


ビュー



「app\views\requests」フォルダにある「create.html.erb」「destroy.html.erb」「update.html.erb」の3ファイルは使用しないので削除して大丈夫です。


ビューを編集していきます。


記述編集 app\views\requests\new.html.erb

<div class="container mt-4 mb-4">
    <div class="card">
        <div class="card-body">
            <div class="card-title font2">
                リクエスト どんな仕事をお探しですか?
            </div>
            <div>
                <%= form_for @request do |f| %>
                    <div class="mt-4">
                        <label class="label">タイトル</label><span class="badge bg-danger">必須</span>
                        <%= f.text_field :title, class: "form-control" %>
                    </div>
                    <div class="mt-4">
                        <label class="label">内容</label><span class="badge bg-danger">必須</span>
                        <%= f.text_area :description, class: "form-control" %>
                    </div>
                    <div class="form-control mt-4">
                        <label class="label">カテゴリー選択</label>
                        <div class="font2">
                            <%= f.select(:category_id, options_for_select(@categories.map { |c| [c.name, c.id] })) %>
                        </div>
                    </div>
                    <div class="mt-4">
                        <label class="label">期日(日)</label>
                        <%= f.number_field :delivery, placeholder: "1〜30", class: "form-control" %>
                    </div>
                    <div class="mt-4">
                        <label class="label">予算(円)</label>
                        <%= f.number_field :budget, placeholder: "最低500円", class: "form-control" %>
                    </div>
                    <div class="mt-4">
                        <label class="label">ファイルのアップロード</label><span class="badge bg-primary">オプション</span>
                        <div class="mt-2">
                                <%= f.file_field :attachment_file, class: "form-control" %>
                        </div>
                    </div>
                    <div class="mt-4">
                        <%= f.submit 'リクエストする', class: "btn btn-danger w-100" %>
                    </div>
                
                <% end %>

            </div>
        </div>
    </div>

</div>

<script>
    $(document).ready(function() {
        var file = $('.file-input');
        file.change(function(e) {
            if (file[0].files.length > 0) {
                var attachment = file[0].files[0];
                $('.file-name').text(attachment.name + " (" + attachment.size + " bytes)");
            }
        })
    })
</script>



ブラウザ確認
http://localhost:3000/requests/new


リクエストの登録ができます。

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



登録したリクエストを編集できるようビューを編集します。
記述編集 app\views\requests\edit.html.erb

<div class="container mt-4 mb-4">
    <div class="card">
        <div class="card-body">
            <div class="card-title font2">
                リクエスト内容更新 どんな仕事をお探しですか?
            </div>
            <div>
                <%= form_for @request do |f| %>
                    <div class="mt-4">
                        <label class="label">タイトル</label><span class="badge bg-danger">必須</span>
                        <%= f.text_field :title, class: "form-control" %>
                    </div>
                    <div class="mt-4">
                        <label class="label">内容</label><span class="badge bg-danger">必須</span>
                        <%= f.text_area :description, class: "form-control" %>
                    </div>
                    <div class="form-control mt-4">
                        <label class="label">カテゴリー選択</label>
                        <div class="font2">
                            <%= f.select(:category_id, options_for_select(@categories.map { |c| [c.name, c.id] })) %>
                        </div>
                    </div>
                    <div class="mt-4">
                        <label class="label">期日(日)</label>
                        <%= f.number_field :delivery, placeholder: "1〜30", class: "form-control" %>
                    </div>
                    <div class="mt-4">
                        <label class="label">予算(円)</label>
                        <%= f.number_field :budget, placeholder: "最低500円", class: "form-control" %>
                    </div>
                    <div class="mt-4">
                        <label class="label">ファイルのアップロード</label><span class="badge bg-primary">オプション</span>
                        <div class="mt-2">
                                <%= f.file_field :attachment_file, class: "form-control" %>
                        </div>
                        <% if @request.attachment_file.attached? %>
                            <div class="mt-2">
                                <%= link_to url_for(@request.attachment_file), 
                                                class: "badge bg-success",  
                                                download: "Attachment_#{@request.attachment_file.id}",
                                                style: "text-decoration: none;" do %>

                                    <i class="fas fa-paperclip fa-lg p-r-5"></i><span class="fs-6"><%= @request.attachment_file.filename %></span>
    
                                <% end %>
                            </div>
                        <% end %>
                    </div>
                    <div class="mt-4">
                        <%= f.submit 'リクエスト内容を更新', class: "btn btn-danger w-100" %>
                    </div>
                
                <% end %>

            </div>
        </div>
    </div>

</div>

<script>
    $(document).ready(function() {
        var file = $('.file-input');
        file.change(function(e) {
            if (file[0].files.length > 0) {
                var attachment = file[0].files[0];
                $('.file-name').text(attachment.name + " (" + attachment.size + " bytes)");
            }
        })
    })
</script>



ブラウザ確認
リクエストの編集ができます。
http://localhost:3000/requests/1/edit

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



クライアントが登録したリクエストを確認するページを作成します。
記述編集 app\views\requests\index.html.erb

<div class="container mt-4">
    <div class="card">
        <div class="card-body">

            <h5 class="card-title text-danger h3 font1">リクエスト一覧(クライアント)</h5>
            <div class="mt-4">
                <%= link_to '新しいリクエストを登録', new_request_path, class: "btn btn-primary"%>
            </div>
            <% if @requests.blank? %>
                <h5 class="font1">表示できるリクエストはありません。</h5>
            <% end %>

            <% @requests.each do |r| %>
                <div class="card mt-4">
                    <div class="card-body">
                        <div class="mt-2">                                    

                        <%= link_to edit_request_path(r), style: "text-decoration: none;" do %>
                            <span class="text-success">
                                <i class="far fa-edit fa-lg"></i>編集
                            </span>
                        <% end %>

                        <%= link_to r, method: :delete, data: {confirm: "削除してよろしいですか?"}, style: "text-decoration: none;" do %>
                            <span class="text-danger">
                                <i class="far fa-trash-alt fa-lg"></i>削除
                            </span>
                        <% end %>

                        </div>
                        <ul class="list-group mt-4">

                            <li class="list-group-item" style="border: none;">
                                <span class="font1">リクエスト日:</span><%= I18n.l(r.created_at, format: :full_date) %>
                            </li>
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">リクエスト名:</span>
                                <%= link_to r.title, request_path(r), class: "btn btn-light" %>
                            </li>
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">期日:</span>   <%= r.delivery %></li>
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">価格:</span><%= number_to_currency(r.budget) %>
                            </li>                  
                        </ul>

                    </div>
                </div>
            <% end %>
        </div>
    </div>
</div>



表示を確認します。
ブラウザ確認
http://localhost:3000/requests

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



表示テストで利用するため、fakerを使ってリクエストを登録します。


「db\seeds.rb」ファイルの前回登録した部分(10行目から33行目まで)をコメントアウトします。
コメントアウトは範囲選択して「Command+/」で一気にできます。
その後、次の記述を追加してください。


記述追加 db\seeds.rb(33行目)

10.times do
    random_user = User.all.sample(1)[0]
    category = Category.all.sample(1)[0]
    request = Request.create(
        title: Faker::Job.title,
        description: Faker::Quote.matz,
        budget: Faker::Number.between(from: 500, to: 5000),
        delivery: Faker::Number.between(from: 1, to: 30),
        user_id: random_user.id,
        category_id: category.id
    )
end



db\seeds.rb

# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the bin/rails db:seed command (or created alongside the database with db:setup).
#
# Examples:
#
#   movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }])
#   Character.create(name: 'Luke', movie: movies.first)

# テストカテゴリーを追加(10個)
# 10.times do
#     Category.create(
#         name: Faker::Job.unique.field
#     )
# end

# # テストユーザーを追加(5ユーザー パスワードは 123456)
# 5.times do
#     user = User.create(
#         full_name: Faker::Name.name,
#         email: Faker::Internet.email,
#         about: Faker::Quote.matz,
#         password: '123456',
#         created_at: Date.today
#     )

#     user.avatar.attach(                
#         io: image = URI.open("https://i.pravatar.cc/300"),
#         filename: "avatar#{user.id}.jpg", 
#         content_type: 'image/jpg'
#     )
# end

10.times do
    random_user = User.all.sample(1)[0]
    category = Category.all.sample(1)[0]
    request = Request.create(
        title: Faker::Job.title,
        description: Faker::Quote.matz,
        budget: Faker::Number.between(from: 500, to: 5000),
        delivery: Faker::Number.between(from: 1, to: 30),
        user_id: random_user.id,
        category_id: category.id
    )
end



コマンド
rails db:seed


Posticoでテーブルを確認します。

ランダムなリクエスト登録
ランダムなリクエスト登録



全てのリクエストを表示させるビューを作成します。
「app\views\requests\list.html.erb」ファイルを以下の内容に編集します。


記述編集 app\views\requests\list.html.erb

<div class="container mt-4">
    <h4 class="font1">
        全てのリクエスト
    </h4>
    <div class="row">
        <%= form_tag '', method: :get do %>
            <%= select_tag 'category', content_tag(:option, '全てのカテゴリー', value: "") + 
                                        options_for_select(@categories.map { |c| [c.name, c.id] }, 
                                        selected: @category_id),
                                        onchange: "this.form.submit();" %>
        <% end %>
        <% @requests.each do |r| %>

            <div class="col-md-4">
                <div class="card mb-2">
                    <div class="card-body">
                        <ul class="list-group mt-4">
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">リクエスト日:</span><%= I18n.l(r.created_at, format: :full_date) %>
                            </li>
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">リクエスト名:</span>
                                <%= link_to r.title, request_path(r), class: "btn btn-light" %>
                            </li>
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">クライアント</span>                            
                                <%= link_to user_path(r.user), class: "tootip", style: "text-decoration: none;" do %>
                                    <span class="btn btn-light"><%= r.user.full_name %></span>
                                <% end %>                                                                     
                            </li>                    
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">期日:</span>   <%= r.delivery %></li>
                            <li class="list-group-item" style="border: none;">
                                <span class="font1">価格:</span><%= number_to_currency(r.budget) %>
                            </li>
                            <% if r.attachment_file.attached? %>
                                <div class="mt-2">
                                    <%= link_to url_for(r.attachment_file), 
                                                    class: "badge bg-success",  
                                                    download: "Attachment_#{r.attachment_file.id}",
                                                    style: "text-decoration: none;" do %>

                                        <i class="fas fa-paperclip fa-lg p-r-5"></i><span class="fs-6"><%= r.attachment_file.filename %></span>

                                    <% end %>
                                </div>
                            <% end %>                                      
                        </ul>
                    </div>
                </div>
            </div>
        <% end %>
    </div>
</div>





ブラウザ確認
http://localhost:3000/all_requests


カテゴリー検索もできます。

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



リクエストの詳細ページを実装します。
「app\views\requests\show.html.erb」ファイルを以下の内容に編集します。


記述編集 app\views\requests\show.html.erb

<div class="container mt-4">
        <div class="card">
            <div class="card-body">
                <!-- タイトル -->
                <div class="card-title">
                    <h3 class="font1"><%= @request.title %></h3>
                    <div class="mt-4">
                        <div class="mt-4">
                            <span class="font1">期日:</span><%= @request.delivery %>日 | <span class="font1">申し込み:</span> 0 | <span class="font1">予算:</span> <%= number_to_currency(@request.budget) %>
                        </div>
                    </div>

                    <!-- 内容 -->
                    <div class="card">
                        <div class="card-body">

                        <div>
                            <span class="font1">カテゴリー:</span><%= @request.category.name %>
                        </div>
                        <div>
                            <span class="font1">リクエスト日:</span><%= I18n.l(@request.created_at, format: :full_date) %>
                        </div>

                        <h6 class="font1 mt-4">クライアント</h6>
                        <div class="mt-2">
                            <%= link_to user_path(@request.user), style: "text-decoration:none;" do %>
                                <%= image_tag avatar_url(@request.user), class: "bd-placeholder-img figure-img img-fluid rounded-pill", style: "width: 80px;" %>
                                <span class="font2 text-dark h4"><%= @request.user.full_name %></span>
                            <% end %>
                        </div>

                        <div class="card-title mt-4"><h4 class="font1">内容</strong></h4>
                            <div class="mt-4">
                                <span class="font2"><%= @request.description %></span>
                            </div>
                            <% if @request.attachment_file.attached? %>
                                <div class="mt-4 mb-4">
                                    <%= link_to url_for(@request.attachment_file), 
                                        class: "badge bg-success",  
                                        download: "Attachment_#{@request.attachment_file.id}",
                                        style: "text-decoration: none;" do %>

                                            <i class="fas fa-paperclip fa-lg p-r-5"></i><span class="fs-6"><%= @request.attachment_file.filename %></span>
                                    <% end %>
                                </div>
                            <% end %>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>



ブラウザを確認します。
ブラウザ確認
http://localhost:3000/requests/1

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



ダッシュボードに登録したリクエストを表示させます。
「app/views/users/dashboard.html.erb」ファイルに以下の記述を追加します。

            <!-- 登録リクエスト -->
            <div class="card mt-2">
                <div class="card-body">
                    <h5 class="card-title">登録しているリクエスト</h5>

                    <div class="row">
                    <% current_user.requests.each do |r| %>

                        <div class="col-md-4">
                            <div class="card mb-2">
                                <div class="card-body">
                                    <ul class="list-group mt-4">
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト日:</span><%= I18n.l(r.created_at, format: :full_date) %>
                                        </li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト名:</span>
                                            <%= link_to r.title, request_path(r), class: "btn btn-light" %>
                                        </li>               
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">期日:</span>   <%= r.delivery %></li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">価格:</span><%= number_to_currency(r.budget) %>
                                        </li>
                                        <% if r.attachment_file.attached? %>
                                            <div class="mt-2">
                                                <%= link_to url_for(r.attachment_file), 
                                                                class: "badge bg-success",  
                                                                download: "Attachment_#{r.attachment_file.id}",
                                                                style: "text-decoration: none;" do %>
            
                                                    <i class="fas fa-paperclip fa-lg p-r-5"></i><span class="fs-6"><%= r.attachment_file.filename %></span>
            
                                                <% end %>
                                            </div>
                                        <% end %>
                                        <li class="list-group-item mt-4" style="border: none;">
                                        <%= link_to edit_request_path(r), class: "btn btn-outline-primary w-100 mb-4" do %>
                                            登録内容編集
                                        <% end %>
                                        </li>                                      
                                    </ul>
                                </div>
                            </div>
                        </div>
                    <% end %>
                    </div>
                </div>
            </div>



記述編集 【app/views/users/dashboard.html.erb】119行目

<div class="container mt-4 mb-4">
    <div class="row">
        <!-- 左側 -->
        <div class="col-md-4">
            <div class="card">
                <div class="card-body">
                    <!-- アバター -->
                    <%= image_tag avatar_url(current_user), class: "img-fluid img-thumbnail rounded-pill" %>
                    <h4 style="margin-left: 5.5rem;"><%= current_user.full_name %></h4>
                    <!-- 画像アップロードボタン -->
                    <button class="btn btn-dark text-light w-100" type="button" data-bs-toggle="collapse" data-bs-target="#collapse1" aria-expanded="false" aria-controls="collapse1">
                        <i class="fa-solid fa-cloud-arrow-up"></i>アバター画像アップロード
                    </button>
                    <div class="collapse" id="collapse1">
                    <div class="card card-body">
                        <%= form_for :user, url: users_edit_url(current_user), action: :update, method: :post do |f| %>
                            <%= f.file_field :avatar, class: "input-group-text", onchange: "this.form.submit();" %>
                        <% end %>   
                    </div>
                </div>
                <hr/>
                登録:<%= I18n.l(current_user.created_at, format: :full_date) %>
                <hr/>
                <div type="button" data-bs-toggle="collapse" data-bs-target="#collapse2" aria-expanded="false" aria-controls="collapse2">

                    <% if current_user.status %>
                        <span class="btn btn-success"><i class="toggle far fa-edit"></i>オンライン</span>
                    <% else %>
                        <span class="btn btn-secondary"><i class="toggle far fa-edit"></i>オフライン</span>
                    <% end %>                
                
                </div>
                <div class="collapse" id="collapse2">
                    <div class="card card-body">

                        <%= form_for :user, url: users_edit_url(current_user), action: :update, method: :post do |f| %>
                            <%= f.select(:status, options_for_select([["オンライン", true], ["オフライン", false]]), {}, {class: "custom-select"}) %>                        
                            <%= f.submit "保存", class: "btn btn-dark" %>
                        <% end %>

                    </div>
                </div>
                <hr/>
                <div class="h5"><%= current_user.about %></div>
                <button class="btn btn-secondary" type="button" data-bs-toggle="collapse" data-bs-target="#collapse3" aria-expanded="false" aria-controls="collapse3">
                    自己紹介編集
                </button>

                <div class="collapse" id="collapse3">
                    <div class="card card-body">
                        <%= form_for :user, url: users_edit_url(current_user), action: :update, method: :post do |f| %>
                            <div><%= f.text_area :about, autofocus: true, autocomplete: 'form'%></div>
                            <%= f.submit "保存", class: "btn btn-dark" %>
                        <% end %>                        
                    </div>
                </div>
                <hr />
                <!-- 電話番号 -->
                <div>
                    <% if !current_user.phone_number.blank? %>
                        <span class="pull-right icon-babu"><i class="far fa-check-circle" style="color:green;"></i></span>&nbsp;&nbsp;電話番号
                    <% else %>
                        <div class="text-danger">電話番号が登録されていません</div>
                        <%= link_to  "電話番号登録", edit_user_registration_path, class: "btn btn-danger" %>
                    <% end %>                    
                    </div>       
                    
                </div>
            </div>
        </div>
        <!-- 右側 -->
        <div class="col-md-8">

            <!-- お知らせ -->
            <div class="card">
                <div class="card-body">
                    <h5 class="card-title">お知らせ</h5>
                    <h6 class="card-subtitle mb-2 text-body-secondary">
                    </h6>
                    <p class="card-text">
                    </p>    
                </div>
            </div>

            <!-- 登録している仕事 -->
            <div class="card mt-2">
                <div class="card-body">
                    <h5 class="card-title">登録している仕事</h5>

                    <div class="row">
                        <% current_user.gigs.each do |gig| %>
                            <% if gig.active? %>
                                <div class="col-md-4">
                                    <div class="card mb-2">
                                    <%= link_to gig_path(gig), data: { turbolinks: false} do %>
                                        <%= image_tag gig_cover(gig), style: "width: 100%;", class: "card-img-top" %>
                                    <% end %>                                    
                                        <div class="card-body">
                                            <%= link_to gig_path(gig), data: { turbolinks: false} do %>
                                                <h5 class="card-title">
                                                    <span class="btn btn-light"><%= gig.title %></span>
                                                </h5>
                                            <% end %>
                                            <div class="card-text" style="margin-left: 0.5rem;">
                                                <p><%= gig.summary %></p>          
                                                <%= link_to edit_gig_path(gig), class: "btn btn-outline-primary w-100 mb-4" do %>
                                                    登録内容編集
                                                <% end %>
                                              
                                            </div>                             
                                        </div>
                                    </div>
                                </div>
                            <% end %>
                        <% end %>
                    </div>
                </div>
            </div>
            <!-- 登録リクエスト -->
            <div class="card mt-2">
                <div class="card-body">
                    <h5 class="card-title">登録しているリクエスト</h5>

                    <div class="row">
                    <% current_user.requests.each do |r| %>

                        <div class="col-md-4">
                            <div class="card mb-2">
                                <div class="card-body">
                                    <ul class="list-group mt-4">
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト日:</span><%= I18n.l(r.created_at, format: :full_date) %>
                                        </li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト名:</span>
                                            <%= link_to r.title, request_path(r), class: "btn btn-light" %>
                                        </li>               
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">期日:</span>   <%= r.delivery %></li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">価格:</span><%= number_to_currency(r.budget) %>
                                        </li>
                                        <% if r.attachment_file.attached? %>
                                            <div class="mt-2">
                                                <%= link_to url_for(r.attachment_file), 
                                                                class: "badge bg-success",  
                                                                download: "Attachment_#{r.attachment_file.id}",
                                                                style: "text-decoration: none;" do %>
            
                                                    <i class="fas fa-paperclip fa-lg p-r-5"></i><span class="fs-6"><%= r.attachment_file.filename %></span>
            
                                                <% end %>
                                            </div>
                                        <% end %>
                                        <li class="list-group-item mt-4" style="border: none;">
                                        <%= link_to edit_request_path(r), class: "btn btn-outline-primary w-100 mb-4" do %>
                                            登録内容編集
                                        <% end %>
                                        </li>                                      
                                    </ul>
                                </div>
                            </div>
                        </div>
                    <% end %>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>



ブラウザを確認します。
ブラウザ確認
http://localhost:3000/dashboard

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



ユーザ詳細ページに登録リクエストを追加します。
「app/views/users/show.html.erb」ファイルに以下の記述を追加します。

            <!-- 登録リクエスト -->
            <div class="card mt-2">
                <div class="card-body">
                    <h5 class="card-title font1"><%= @user.full_name %>さんが登録しているリクエスト</h5>

                    <div class="row">
                    <% @user.requests.each do |r| %>

                        <div class="col-md-4">
                            <div class="card mb-2">
                                <div class="card-body">
                                    <ul class="list-group mt-4">
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト日:</span><%= I18n.l(r.created_at, format: :full_date) %>
                                        </li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト名:</span>
                                            <%= link_to r.title, request_path(r), class: "btn btn-light" %>
                                        </li>               
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">期日:</span>   <%= r.delivery %></li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">価格:</span><%= number_to_currency(r.budget) %>
                                        </li>
                                        <% if r.attachment_file.attached? %>
                                            <div class="mt-2">
                                                <%= link_to url_for(r.attachment_file), 
                                                                class: "badge bg-success",  
                                                                download: "Attachment_#{r.attachment_file.id}",
                                                                style: "text-decoration: none;" do %>
            
                                                    <i class="fas fa-paperclip fa-lg p-r-5"></i><span class="fs-6"><%= r.attachment_file.filename %></span>
            
                                                <% end %>
                                            </div>
                                        <% end %>         
                                    </ul>
                                </div>
                            </div>
                        </div>
                    <% end %>
                </div>
            </div>



記述追加 【app/views/users/show.html.erb】74行目

<div class="container mt-4 mb-4">
    <div class="row">
        <!-- 左側 -->
        <div class="col-md-4 mb-4">
            <div class="card">
                <div class="card-body">

                    <!-- ステータス -->
                    <div>
                        <% if @user.status %>
                            <span class="badge bg-success"><i class="fa-regular fa-bell"></i>オンライン</span>
                        <% else %>
                            <span class="btn btn-secondary"><i class="fa-regular fa-bell-slash"></i>オフライン</span>
                        <% end %>                                   
                    </div>                
                    <!-- アバター -->
                    <%= image_tag avatar_url(@user), class: "img-fluid img-thumbnail rounded-pill" %>
                    <h4 class="text-center"><%= @user.full_name %></h4>   
                    
                    <!-- 自己紹介 -->
                    <div class="h5 text-center"><%= @user.about %></div>                           
                </div>
            </div>       

        </div>
        <!-- 右側 -->
        <div class="col-md-8">

            <!-- レビュー -->
            <div class="card mb-2">           
                <div class="card-body">
                    <h5 class="card-title"><%= @user.full_name %>さんへのレビュー</h5>
                    <h6 class="card-subtitle mb-2 text-body-secondary">
                    </h6>
                    <p class="card-text">
                    </p>    
                </div>
            </div>     

            <!-- 登録している仕事 -->
            <div class="card mb-2">
                <div class="card-body">
                    <h5 class="card-title font1"><%= @user.full_name %>さんが登録している仕事</h5>

                    <div class="row">
                        <% @user.gigs.each do |gig| %>
                            <% if gig.active? %>
                                <div class="col-md-4">
                                    <div class="card mb-2">
                                        <%= link_to gig_path(gig), data: { turbolinks: false} do %>
                                            <%= image_tag gig_cover(gig), style: "width: 100%;", class: "card-img-top" %>
                                        <% end %>                                    
                                        <div class="card-body">
                                            <%= link_to gig_path(gig), data: { turbolinks: false} do %>
                                                <h5 class="card-title">
                                                    <span class="btn btn-light"><%= gig.title %></span>
                                                </h5>
                                                <div class="badge bg-primary">
                                                    <% if gig.has_single_pricing%>
                                                        シングルプランのみ
                                                    <% else %>
                                                        3プラン
                                                    <% end %>
                                                </div>
                                            <% end %>                        
                                        </div>
                                    </div>
                                </div>
                            <% end %>
                        <% end %>
                    </div>
                </div>  
            </div>
            <!-- 登録リクエスト -->
            <div class="card mt-2">
                <div class="card-body">
                    <h5 class="card-title font1"><%= @user.full_name %>さんが登録しているリクエスト</h5>

                    <div class="row">
                    <% @user.requests.each do |r| %>

                        <div class="col-md-4">
                            <div class="card mb-2">
                                <div class="card-body">
                                    <ul class="list-group mt-4">
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト日:</span><%= I18n.l(r.created_at, format: :full_date) %>
                                        </li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">リクエスト名:</span>
                                            <%= link_to r.title, request_path(r), class: "btn btn-light" %>
                                        </li>               
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">期日:</span>   <%= r.delivery %></li>
                                        <li class="list-group-item" style="border: none;">
                                            <span class="font1">価格:</span><%= number_to_currency(r.budget) %>
                                        </li>
                                        <% if r.attachment_file.attached? %>
                                            <div class="mt-2">
                                                <%= link_to url_for(r.attachment_file), 
                                                                class: "badge bg-success",  
                                                                download: "Attachment_#{r.attachment_file.id}",
                                                                style: "text-decoration: none;" do %>
            
                                                    <i class="fas fa-paperclip fa-lg p-r-5"></i><span class="fs-6"><%= r.attachment_file.filename %></span>
            
                                                <% end %>
                                            </div>
                                        <% end %>           
                                    </ul>
                                </div>
                            </div>
                        </div>
                    <% end %>
                </div>
            </div>
        </div>
    </div>
</div>



表示を確認します。
ブラウザ確認
http://localhost:3000/users/2

PCレイアウト
PCレイアウト


モバイルレイアウト
モバイルレイアウト



ナビゲーションバーにリンクを追加します。


記述追加 app\views\shared\_navbar.html.erb
35,41,42行目にリンクを追加しています。

<li><%= link_to  "リクエスト", all_requests_path, class: "dropdown-item btn btn-light" %></li>
<li><%= link_to  "リクエスト登録", new_request_path, class: "dropdown-item btn btn-light" %></li>
<li><%= link_to  "リクエスト確認", requests_path, class: "dropdown-item btn btn-light" %></li>


<nav class="navbar navbar-expand-lg bg-body-tertiary">
  <div class="container-fluid">
    <a class="navbar-brand" href="/"><span class="font1">Gig Hub</span></a>
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
        <!-- もしログインしていなかったら-->
        <% if (!user_signed_in?) %>
        <li class="nav-item" style="margin-bottom: 0.1rem;">
          <span style="margin-left: 1rem;">
          <%= link_to  "新規登録", new_user_registration_path, class: "btn btn-danger" %>
          </span>
        </li>
        <li class="nav-item">
          <span style="margin-left: 1rem;">
            <%= link_to  "ログイン", new_user_session_path, class: "btn btn-success text-light" %>
          </span>
        </li>
      </ul>
      <!-- ログインしていたら -->
      <% else %>
      <ul class="navbar-nav" style="margin-left: 2rem;">
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">

          <figure style="position:relative; top: 0.2rem;" class="avatar <%= current_user.status ? "online" : "offline" %>"></figure>  
          <%= image_tag avatar_url(current_user), class: "bd-placeholder-img figure-img img-fluid rounded-pill", style: "width: 40px; height: 30px;" %>          
            <%= current_user.full_name %>
          </a>
          <ul class="dropdown-menu">
            <li><%= link_to  "ダッシュボード", dashboard_path, class: "dropdown-item btn btn-lightt" %></li>
            <li><%= link_to  "ユーザ登録情報編集", edit_user_registration_path, class: "dropdown-item btn btn-light" %></li>
            <li><%= link_to  "リクエスト", all_requests_path, class: "dropdown-item btn btn-light" %></li>
            <li><hr class="dropdown-divider"><span class="badge bg-danger" style="margin-left: 1rem;">フリーランサー</span></li>
            <li><%= link_to  "仕事を新規登録", new_gig_path, class: "dropdown-item btn btn-light" %></li>
            <li><%= link_to  "仕事確認", selling_orders_path, class: "dropdown-item btn btn-light" %></li>
            <li><hr class="dropdown-divider"><span class="badge bg-primary" style="margin-left: 1rem;">クライアント</span></li>
            <li><%= link_to  "依頼確認", buying_orders_path, class: "dropdown-item btn btn-light" %></li>
            <li><%= link_to  "リクエスト登録", new_request_path, class: "dropdown-item btn btn-light" %></li>
            <li><%= link_to  "リクエスト確認", requests_path, class: "dropdown-item btn btn-light" %></li>
            <li><hr class="dropdown-divider"></li>
            <li><%= link_to  "ログアウト", destroy_user_session_path, method: :delete, class: "dropdown-item btn btn-light" %></li>
          </ul>
        </li>
      </ul>
      <% end %>

    </div>
  </div>
</nav>


ナビゲーションバーにリンク追加
ナビゲーションバーにリンク追加



31 | Orderの確認】 << 【ホーム】 >> 【33 | Offer


↓↓クリックして頂けると励みになります。