Rails: アカウント凍結と一覧表示

Rails- アカウント登録の続きです。

環境
Ruby 2.7.2
Rails 6.1.3

リポジトリ
https://github.com/usutani/try_account

アカウントの凍結

画像4

アカウント一覧から凍結操作ができるように、accountsリソースにindexを追加する。凍結/凍結解除ができるようにfreezeリソースを追加する。
(参考)Rails- 覚書- DHH流のルーティング|usutani|note

# config/routes.rb
Rails.application.routes.draw do
  namespace :account do
    resources :registrations, only: %i[show new create]
  end
  resources :accounts, only: %i[index show new create] do
    resource :freeze, only: %i[create destroy], module: 'accounts'
  end
end

モデルとコントローラーを生成する。

bin/rails g model account/freeze account:belongs_to
Overwrite ...app/models/account.rb? (enter "h" for help) [Ynaqdhm] n
bin/rails db:migrate

bin/rails g controller accounts/freezes
# app/models/account.rb
class Account < ApplicationRecord
  # ...
  has_one :freeze, dependent: :destroy
end
# app/models/account/freeze.rb
class Account::Freeze < ApplicationRecord
  belongs_to :account
end

アカウント一覧画面を修正する。

# app/views/accounts/index.html.erb
      <th colspan="3"></th>
...
      <tr>
        <td><%= account.email %></td>
        <td><%= link_to 'Show', account %></td>
-        <td><%= link_to 'Edit', edit_account_path(account) %></td>
-        <td><%= link_to 'Destroy', account, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        <td>
          <% if account.freeze %>
            <%= button_to 'To Unfreeze', account_freeze_path(account), method: :delete %>
          <% else %>
            <%= button_to 'To Freeze', account_freeze_path(account) %>
          <% end %>
        </td>
      </tr>

凍結/凍結解除アクションを実装する。

# app/controllers/accounts/freezes_controller.rb
class Accounts::FreezesController < ApplicationController
  def create
    Account.find(params[:account_id]).create_freeze
    redirect_to accounts_url
  end

  def destroy
    Account::Freeze.where(account_id: params[:account_id]).destroy_all
    redirect_to accounts_url
  end
end
open http://localhost:3000/accounts

画像1

凍結アカウント一覧

画像4

名前空間accountsのfreezesリソースを追加する。

  namespace :accounts do
    resources :freezes, only: :index
  end
# config/routes.rb
Rails.application.routes.draw do
  namespace :account do
    resources :registrations, only: %i[show new create]
  end
  namespace :accounts do
    resources :freezes, only: :index
  end
  resources :accounts, only: %i[index show new create] do
    resource :freeze, only: %i[create destroy], module: 'accounts'
  end
end
bin/rails routes -c freeze
          Prefix Verb   URI Pattern                            Controller#Action
accounts_freezes GET    /accounts/freezes(.:format)            accounts/freezes#index
  account_freeze DELETE /accounts/:account_id/freeze(.:format) accounts/freezes#destroy
                 POST   /accounts/:account_id/freeze(.:format) accounts/freezes#create

一覧アクションとビュー追加する。

# app/controllers/accounts/freezes_controller.rb
class Accounts::FreezesController < ApplicationController
  def index
    @accounts = Account.joins(:freeze).where.not(freeze: nil).order(:id)
  end
# app/views/accounts/freezes/index.html.erb
<h1>Freezed Accounts</h1>

<table>
  <thead>
    <tr>
      <th>Email</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @accounts.each do |account| %>
      <tr>
        <td><%= account.email %></td>
        <td><%= link_to 'Show', account %></td>
        <td>
          <%= button_to 'To Unfreeze', account_freeze_path(account), method: :delete %>
        </td>
      </tr>
    <% end %>
  </tbody>
</table>
open http://localhost:3000/accounts/freezes

画像2

以上です。

この記事が気に入ったらサポートをしてみませんか?