Rails: アカウント凍結と一覧表示
Rails- アカウント登録の続きです。
環境
Ruby 2.7.2
Rails 6.1.3
リポジトリ
https://github.com/usutani/try_account
アカウントの凍結
アカウント一覧から凍結操作ができるように、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
凍結アカウント一覧
名前空間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
以上です。
この記事が気に入ったらサポートをしてみませんか?