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)

以上です。

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