Rails: 覚書: 別画面からモデルの一部の項目だけを編集する: ルーティングを別ファイルに分ける
外観
目的
前回は会員の管理者に関するルーティングをサブリソースで実装しましたが、今回は管理者に関するルーティングを別ファイルに分けたいと思います。
環境
Ruby 2.7.2
Rails 6.1.3
前回
config/routes.rb
Rails.application.routes.draw do
resources :members do
resource :owners, only: %i[edit update], module: 'members'
end
end
今回
ファイル分割前
config/routes.rb
Rails.application.routes.draw do
namespace :admin do
resources :members
end
resources :members, except: %i[new create destroy]
end
ファイル分割後
config/routes.rb
Rails.application.routes.draw do
draw(:admin)
resources :members, except: %i[new create destroy]
end
管理者用のルーティングをまとめたファイル
mkdir -p config/routes
config/routes/admin.rb
Rails.application.routes.draw do
namespace :admin do
resources :members
# ...
end
end
アプリの作成
メーラーなどを使用しない設定でアプリを準備します。
rails new try_another_view2 -MCJT \
--skip-action-mailbox --skip-action-text \
--skip-active-job --skip-active-storage
cd try_another_view2 && tmux
足場の準備
手段1. modelを作成した後、scaffold_controllerで名前空間を生成する。
手段2. scaffoldを作成した後、scaffold_controllerで名前空間を生成する。
今回はビューの内容をできる限り流用したいので、手段2で実装します。
尚、scaffoldジェネレータには、モデルはフラットに配置したままで、コントローラーはadminという名前空間を持つというオプションはありません。
bin/rails g scaffold Member \
name agreed:boolean \
admin_note:text admin_confirmed:boolean
bin/rails db:migrate
管理者用のコントローラーの生成
bin/rails g scaffold_controller admin/members \
--model-name=member
ルーティングの修正
ルーティングを外観欄に記述した内容に修正します。
bin/rails routes -c members
Prefix Verb URI Pattern Controller#Action
admin_members GET /admin/members(.:format) admin/members#index
POST /admin/members(.:format) admin/members#create
new_admin_member GET /admin/members/new(.:format) admin/members#new
edit_admin_member GET /admin/members/:id/edit(.:format) admin/members#edit
admin_member GET /admin/members/:id(.:format) admin/members#show
PATCH /admin/members/:id(.:format) admin/members#update
PUT /admin/members/:id(.:format) admin/members#update
DELETE /admin/members/:id(.:format) admin/members#destroy
members GET /members(.:format) members#index
edit_member GET /members/:id/edit(.:format) members#edit
member GET /members/:id(.:format) members#show
PATCH /members/:id(.:format) members#update
PUT /members/:id(.:format) members#update
管理者用のビューの修正
ビューの複製
cp app/views/members/*.html.erb app/views/admin/members/
パスの変更
'Show'
'Edit'
'Back'
前:member
後:[:admin, member]
前:members_path
後:admin_members_path
前:new_member_path
後:new_admin_member_path
前:edit_member_path
後:edit_admin_member_path
例:
app/views/admin/members/_form.html.erb
<%= form_with(model: [:admin, member]) do |form| %>
管理者用のコントローラーの修正
app/controllers/admin/members_controller.rb
def create
#...
format.html { redirect_to [:admin, @member], notice: "Member was successfully created." }
def update
#...
format.html { redirect_to [:admin, @member], notice: "Member was successfully created." }
#...
def member_params
params.require(:member).permit(:name, :agreed, :admin_note, :admin_confirmed)
end
会員用のビュー
newテンプレートを削除します。
rm app/views/members/new.html.erb
newへのリンクを削除します。
app/views/members/index.html.erb
- <%= link_to 'New Member', new_member_path %>
許可する項目だけに修正します。
app/views/members/_form.html.erb
# 省略
会員用のコントローラーの修正
アクションを削除します。
new
create
destroy
許可する項目を変更します。
params.require(:member).permit(:name, :agreed)
以上です。
この記事が気に入ったらサポートをしてみませんか?