Rails 3对象#尝试不起作用?
我该在哪里开始寻找? 这就是让我相信的原因:
0 urzatron work/secret_project % rails c Loading development environment (Rails 3.1.3) irb(main):001:0> t = Tag.new(:name => "!Blark!") => # irb(main):002:0> t.try(:name) => "!Blark!" irb(main):003:0> t.try(:aoeu) NoMethodError: undefined method `aoeu' for # from /usr/lib/ruby/gems/1.9.1/gems/activemodel-3.1.3/lib/active_model/attribute_methods.rb:385:in `method_missing' from /usr/lib/ruby/gems/1.9.1/gems/activerecord-3.1.3/lib/active_record/attribute_methods.rb:60:in `method_missing' from /usr/lib/ruby/gems/1.9.1/gems/activesupport-3.1.3/lib/active_support/core_ext/object/try.rb:32:in `try' from (irb):3 from /usr/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in `start' from /usr/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in `start' from /usr/lib/ruby/gems/1.9.1/gems/railties-3.1.3/lib/rails/commands.rb:40:in `' from script/rails:6:in `require' from script/rails:6:in `'
Tag
模型:
class Tag :destroy end
你误解了try
做法。 从精细手册 :
试试(* a,&b)
调用symbol方法标识的method
,传递任何参数和/或指定的块,就像常规的RubyObject#send
一样。但是,与该方法不同,如果接收对象是
nil
对象或NilClass,则不会引发NoMethodError
exception,而是返回nil
。
这样做:
t.try(:aoeu)
或多或少与此相同:
t.nil?? nil : t.aoeu
但你似乎期待它表现得像这样:
t.respond_to?(:aoeu) ? t.aoeu : nil
你的t
不是nil
所以t.try(:aoeu)
与t.aoeu
相同。 您的Tag类没有aoeu
方法,因此您获得NoMethodError
。
try
只是避免nil
检查的一种方便方法,当对象没有响应你想要使用的方法时,它不是避免NoMethodError
的方法。