Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

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)

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