my_back_pages

プログラミング学習の記録 Ruby / Rails / FjordBootCamp

【Rails】rails g コマンドで --force-plural オプションを使用した際の生成物を rails destroy コマンドで削除するときは、同じオプションを指定する必要がある

タイトル通りです。

--force-pluralオプションを使用して複数形を使ったモデル名のscaffoldを行う

rails g scaffold JazzCafes name:string --force-pluralを実行。

ポイント

  • --force-pluralオプションを使ったので、モデルのファイル名が複数形のapp/models/jazz_cafes.rbになっている。
    • 指定しないと単数系のjazz_cafe.rbとなる。
 ❯ rails g scaffold JazzCafes name:string --force-plural           
       invoke  active_record
       create    db/migrate/20240419024627_create_jazz_cafes.rb
       create    app/models/jazz_cafes.rb
       invoke    test_unit
       create      test/models/jazz_cafes_test.rb
       create      test/fixtures/jazz_cafes.yml
       invoke  resource_route
        route    resources :jazz_cafes
       invoke  scaffold_controller
       create    app/controllers/jazz_cafes_controller.rb
       invoke    erb
       create      app/views/jazz_cafes
       create      app/views/jazz_cafes/index.html.erb
       create      app/views/jazz_cafes/edit.html.erb
       create      app/views/jazz_cafes/show.html.erb
       create      app/views/jazz_cafes/new.html.erb
       create      app/views/jazz_cafes/_form.html.erb
       create      app/views/jazz_cafes/_jazz_cafes.html.erb
       invoke    resource_route
       invoke    test_unit
       create      test/controllers/jazz_cafes_controller_test.rb
       create      test/system/jazz_cafes_test.rb
       invoke    helper
       create      app/helpers/jazz_cafes_helper.rb
       invoke      test_unit
       invoke    jbuilder
       create      app/views/jazz_cafes/index.json.jbuilder
       create      app/views/jazz_cafes/show.json.jbuilder
       create      app/views/jazz_cafes/_jazz_cafe.json.jbuilder

rails destroyによるジェネレーターによる生成物の削除

ジェネレーターコマンドで生成したものを削除できるのがrails destroyコマンド。

  • 生成の例
    • rails g scaffold JazzCafes
  • 削除の例
    • rails destroy scaffold JazzCafes

ActiveRecorddestroyとは別のものです、念の為)

--force-pluralオプションをつけずにrails destroyコマンドを実行する

rails destroy scaffold JazzCafesを実行。

 ❯ rails destroy scaffold JazzCafes
 [WARNING] The model name 'JazzCafes' was recognized as a plural, using the singular 'JazzCafe' instead. Override with --force-plural or setup custom inflection rules for this noun before running the generator.
       invoke  active_record
       remove    db/migrate/20240419030925_create_jazz_caves.rb
       remove    app/models/jazz_cafe.rb
       invoke    test_unit
       remove      test/models/jazz_cafe_test.rb
       remove      test/fixtures/jazz_caves.yml
       invoke  resource_route
        route    resources :jazz_caves
       invoke  scaffold_controller
       remove    app/controllers/jazz_caves_controller.rb
       invoke    erb
       remove      app/views/jazz_caves
       remove      app/views/jazz_caves/index.html.erb
       remove      app/views/jazz_caves/edit.html.erb
       remove      app/views/jazz_caves/show.html.erb
       remove      app/views/jazz_caves/new.html.erb
       remove      app/views/jazz_caves/_form.html.erb
       remove      app/views/jazz_caves/_jazz_cafe.html.erb
       invoke    resource_route
       invoke    test_unit
       remove      test/controllers/jazz_caves_controller_test.rb
       remove      test/system/jazz_caves_test.rb
       invoke    helper
       remove      app/helpers/jazz_caves_helper.rb
       invoke      test_unit
       invoke    jbuilder
       remove      app/views/jazz_caves
       remove      app/views/jazz_caves/index.json.jbuilder
       remove      app/views/jazz_caves/show.json.jbuilder
       remove      app/views/jazz_caves/_jazz_cafe.json.jbuilder

app/models/jazz_cafe.rbを消そうとしています。上で見たように、最初に私が生成したのはファイル名が複数形になっているapp/models/jazz_cafes.rbなので、目的の生成物を消すことができていません。

[WARNING] The model name 'JazzCafes' was recognized as a plural, using the singular 'JazzCafe' instead. Override with --force-plural or setup custom inflection rules for this noun before running the generator

上の警告で出ているように、複数形のJazzCafesrails destroyコマンドの対象に指定したので、Railsの通常のルールに則って単数系のJazzCafeを指定したものとして消去するパスの組み立てが行われた、ということのようです。

--force-pluralオプションをつけてrails destroyコマンドを実行する

rails destroy scaffold JazzCafes --force-pluralを実行。

 ❯ rails destroy scaffold JazzCafes --force-plural 
       invoke  active_record
       remove    db/migrate/20240419024627_create_jazz_cafes.rb
       remove    app/models/jazz_cafes.rb
       invoke    test_unit
       remove      test/models/jazz_cafes_test.rb
       remove      test/fixtures/jazz_cafes.yml
       invoke  resource_route
        route    resources :jazz_cafes
       invoke  scaffold_controller
       remove    app/controllers/jazz_cafes_controller.rb
       invoke    erb
       remove      app/views/jazz_cafes
       remove      app/views/jazz_cafes/index.html.erb
       remove      app/views/jazz_cafes/edit.html.erb
       remove      app/views/jazz_cafes/show.html.erb
       remove      app/views/jazz_cafes/new.html.erb
       remove      app/views/jazz_cafes/_form.html.erb
       remove      app/views/jazz_cafes/_jazz_cafes.html.erb
       invoke    resource_route
       invoke    test_unit
       remove      test/controllers/jazz_cafes_controller_test.rb
       remove      test/system/jazz_cafes_test.rb
       invoke    helper
       remove      app/helpers/jazz_cafes_helper.rb
       invoke      test_unit
       invoke    jbuilder
       remove      app/views/jazz_cafes
       remove      app/views/jazz_cafes/index.json.jbuilder
       remove      app/views/jazz_cafes/show.json.jbuilder
       remove      app/views/jazz_cafes/_jazz_cafe.json.jbuilder

ちゃんと複数形のapp/models/jazz_cafes.rbを消してくれています。 その他、rails g scaffold JazzCafes name:string --force-pluralの生成物をまるっと消してくれています。

生成時に--force-pluralした場合は、削除時も同じオプションが必要になる、ということですね。

なんでこんなことを調べたの?

そもそも、JazzCafeモデルを作ろうとした時に、Railsがなぜか複数形をjazz_cavesと認識して各種ファイルを生成したことから、これらのことを調べ始めることになりました。

モデル名はJazzCafeで、複数形はjazz_cafesとしたいけれど、実際に生成される複数形はjazz_cavesになってしまう。

 ❯ rails g scaffold JazzCafe name:string                
       invoke  active_record
       create    db/migrate/20240419024225_create_jazz_caves.rb
       create    app/models/jazz_cafe.rb
       invoke    test_unit
       create      test/models/jazz_cafe_test.rb
       create      test/fixtures/jazz_caves.yml
       invoke  resource_route
        route    resources :jazz_caves
       invoke  scaffold_controller
       create    app/controllers/jazz_caves_controller.rb
       invoke    erb
       create      app/views/jazz_caves
       create      app/views/jazz_caves/index.html.erb
       create      app/views/jazz_caves/edit.html.erb
       create      app/views/jazz_caves/show.html.erb
       create      app/views/jazz_caves/new.html.erb
       create      app/views/jazz_caves/_form.html.erb
       create      app/views/jazz_caves/_jazz_cafe.html.erb
       invoke    resource_route
       invoke    test_unit
       create      test/controllers/jazz_caves_controller_test.rb
       create      test/system/jazz_caves_test.rb
       invoke    helper
       create      app/helpers/jazz_caves_helper.rb
       invoke      test_unit
       invoke    jbuilder
       create      app/views/jazz_caves/index.json.jbuilder
       create      app/views/jazz_caves/show.json.jbuilder
       create      app/views/jazz_caves/_jazz_cafe.json.jbuilder

デフォルトと異なる単数・複数形ルールを自分で設定することで、この問題は解決できます。 config/initializers/inflections.rb

ActiveSupport::Inflector.inflections(:en) do |inflect|
  # cafeの複数形がcafesになるようにルールを設定
  inflect.irregular "cafe", "cafes"
end

この調査の過程の中で--force-pluralというオプションを知り、いろいろ試す中で気づいたことが本記事の内容でした。

scrapbox.io

以上、備忘録まで。