Hash#assert_valid_keys

Railsの画像添付のためのプラグイン「Paperclip」を使った場合に、モデルで以下のように宣言する。

class User < ActiveRecord::Base
  has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }
end

何も難しいところはないけど、これを、

class User < ActiveRecord::Base
  has_attached_file :avatar, :style => { :medium => "300x300>", :thumb => "100x100>" }
end

と書くと、正しく動作しないし、エラーもでない。これで30分ぐらいハマったという話をRailsに詳しい人にしたら、それは「Hash#assert_valid_keys」を使えない理由があるんでしょうね、という回答だった。何でもかんでもハッシュにシンボルと値を突っ込んで渡すのがRailsでは普通なので、キーの検証をするメソッドが、Hashクラスに追加されているって話。

ruby-1.9.2-p0 > require 'active_support/core_ext'
 => true 
ruby-1.9.2-p0 > { :styles => "a", :size => "20" }.assert_valid_keys(:styles, :size)
 => nil 
ruby-1.9.2-p0 > { :style => "a", :size => "20" }.assert_valid_keys(:styles, :size)ArgumentError: Unknown key(s): style
        from /Users/yarb/.rvm/gems/ruby-1.9.2-p0@rails3/gems/activesupport-3.0.1/lib/active_support/core_ext/hash/keys.rb:43:in `assert_valid_keys'
        from (irb):3
        from /Users/yarb/.rvm/rubies/ruby-1.9.2-p0/bin/irb:17:in `<main>'
ruby-1.9.2-p0 > 

なるほど。

Paperclipはなぜ引数のキーを検証していないんだろうか。lib/paperclip/attachement.rbあたりに1行追加したほうがいいと思うなぁ。というときに、人はパッチを書くものなのだろうか。