merb のコンソール

railsなら

ruby script/console

だけど、merbでは

merb -i


とりあえず、merbを勉強中っす。普通に勉強もしてるんですけど、別系統からも眺めてみたい。
おもむろに

methods.sort

いっぱい出てきたんで、

methods.sort - Object.methods

Railsみたいにappとかhelperとかあるかなーと思ったらなかった。


Module.constants.sort

これでmerbっぽいものを探す。DataMapper,DataObjects,Erubisとか。面倒なので、merbを含むものを出してみた。

>> Module.constants.sort.select{|m| /merb/i =~ m}
=> ["Merb", "MerbAuthSlicePassword", "MerbExceptions"]


モデル系のメソッドはどうなってるんだろう?ということで、モデルがincludeするDataMapper::Resourceを調べる。

>> DataMapper::Resource.methods.sort - Object.methods
=> ["append_inclusions", "descendants", "extra_inclusions", "included"]

あ、descendantsがある。これでモデルのクラスをSetで取得できるんすね。


モデルのクラスメソッドを調べてみる。

?> User.methods.sort - Object.methods
=> ["[]", "_load", "_valid_model", "add_validator_to_context", "after", "after_class_method", "aggregate", "all", "args_for", "assert_kind_of", "authenticate", "auto_generate_validations", "auto_migrate!", "auto_migrate_down!", "auto_migrate_up!", "auto_upgrade!", "avg", "base_model", "before", "before_class_method", "belongs_to", "class_hooks", "copy", "count", "create", "create!", "create_context_instance_methods", "default_order", "default_repository_name", "default_scope", "define_advised_method", "define_hook_stack_execution_methods", "eager_properties", "encrypt", "field_naming_convention", "find_by_sql", "first", "first_or_create", "get", "get!", "has", "hook_method_name", "hooks_with_scope", "inheritance_property", "inherited", "inline_call", "install_hook", "instance_hooks", "is", "key", "load", "many_to_one_relationships", "max", "method_added", "method_with_scope", "min", "n", "options_with_message", "opts_from_validator_args", "paranoid_properties", "process_method_added", "properties", "properties_with_subclasses", "property", "query", "quote_method", "register_class_hooks", "register_hook", "register_instance_hooks", "registered_as_hook?", "relationships", "repositories", "repository_name", "reset_hook!", "singleton_method_added", "storage_exists?", "storage_name", "storage_names", "sum", "timestamps", "to_query", "transaction", "typecast_key", "validates_absent", "validates_format", "validates_is_accepted", "validates_is_confirmed", "validates_is_number", "validates_is_primitive", "validates_is_unique", "validates_length", "validates_present", "validates_with_block", "validates_with_method", "validates_within", "validators", "with_exclusive_scope", "with_scope"]

table_nameではなく、storage_name, storage_namesで取得できるんだー。へー

>> User.storage_name
=> "users"
>> User.storage_names
=> {:default=>"users"}

storage_namesはどう使うんだろう?



validatorsがある!

>> User.validators
=> #<DataMapper::Validate::ContextualValidators:0x38edac @contexts={:default=>[#<DataMapper::Validate::LengthValidator:0x394fcc @validation_method=:max, @max=50, @range=nil, @unless_clause=nil, @options={:allow_nil=>true, :message=>nil, :maximum=>50, :context=>:default}, @field_name=:login, @min=nil, @if_clause=nil, @equal=nil>, #<DataMapper::Validate::PrimitiveValidator:0x386dc8 @unless_clause=nil, @options={:allow_nil=>true, :message=>nil, :maximum=>50, :context=>:default}, @field_name=:login, @if_clause=nil>, #<DataMapper::Validate::LengthValidator:0x3390a0 @validation_method=:max, @max=50, @range=nil, @unless_clause=nil, @options={:allow_nil=>true, :message=>nil, :maximum=>50, :context=>:default}, @field_name=:crypted_password, @min=nil, @if_clause=nil, @equal=nil>, #<DataMapper::Validate::PrimitiveValidator:0x3327dc @unless_clause=nil, @options={:allow_nil=>true, :message=>nil, :maximum=>50, :context=>:default}, @field_name=:crypted_password, @if_clause=nil>, #<DataMapper::Validate::LengthValidator:0x325424 @validation_method=:max, @max=50, @range=nil, @unless_clause=nil, @options={:allow_nil=>true, :message=>nil, :maximum=>50, :context=>:default}, @field_name=:salt, @min=nil, @if_clause=nil, @equal=nil>, #<DataMapper::Validate::PrimitiveValidator:0x31d760 @unless_clause=nil, @options={:allow_nil=>true, :message=>nil, :maximum=>50, :context=>:default}, @field_name=:salt, @if_clause=nil>, #<DataMapper::Validate::RequiredFieldValidator:0x307ba4 @unless_clause=nil, @options={:context=>:default}, @field_name=:password, @if_clause=#<Proc:0x0033bdf0@/opt/local/lib/ruby/gems/1.8/gems/merb-auth-more-1.0.11/lib/merb-auth-more/mixins/salted_user/dm_salted_user.rb:11>>, #<DataMapper::Validate::ConfirmationValidator:0x301524 @unless_clause=nil, @field_name=:password, @options={:allow_nil=>true, :context=>:default}, @if_clause=#<Proc:0x0033b2ec@/opt/local/lib/ruby/gems/1.8/gems/merb-auth-more-1.0.11/lib/merb-auth-more/mixins/salted_user/dm_salted_user.rb:12>, @confirm_field_name=:password_confirmation>]}>

おおー!いいね!Railsで各モデルに定義されているバリデーションを取得したくて大変なことをやった覚えがあるので、感慨深いっす。
もしかして何もチェックしない場合でもvalidatorがあるのかな?へー面白い。

眠いのでまた今度・・・