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行追加したほうがいいと思うなぁ。というときに、人はパッチを書くものなのだろうか。