タイトル通りです。
--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|
inflect.irregular "cafe", "cafes"
end
この調査の過程の中で--force-plural
というオプションを知り、いろいろ試す中で気づいたことが本記事の内容でした。
scrapbox.io
以上、備忘録まで。