Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

railsにでてくるclass_optionなるものの正体

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)

...凄く、コワイです。