タイトル通りです。
--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
(ActiveRecordのdestroy
とは別のものです、念の為)
--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
上の警告で出ているように、複数形のJazzCafes
をrails 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
というオプションを知り、いろいろ試す中で気づいたことが本記事の内容でした。
以上、備忘録まで。