submitでモデルから挙動を判定してくれるアレですが...
3.0からの機能のようですね。
これで使われているのがclass_optionなるものに記録されたmodel名です。
実装をみたところBaseクラスに対してmethodを定義してあげているだけ...でした
# File railties/lib/rails/generators/base.rb ... module Rails module Generators class Error < Thor::Error # :nodoc: end class Base < Thor::Group ... ##line 200 def self.class_option(name, options={}) #:nodoc: options[:desc] = "Indicates when to generate #{name.to_s.humanize.downcase}" unless options.key?(:desc) options[:aliases] = default_aliases_for_option(name, options) options[:default] = default_value_for_option(name, options) super(name, options) end
というわけで、ActiveModelで生成されたModelはBaseを継承しているので以下の挙動が実現します
base.class.respond_to?(:model_name)
...凄く、コワイです。
参考もと
https://github.com/rails/rails/blob/f8dcc485175d7e5ac3c5d2819b3a04cd2e5d4982/railties/lib/rails/generators/resource_helpers.rb
https://github.com/rails/rails/blob/d1f7d76dfd0a907c59bfe495de7ac2cf36d71678/railties/lib/rails/generators/base.rb
http://apidock.com/rails/Rails/Generators/Base/class_option/class