我应该从哪里开始寻找?这就是让我相信的原因:
0 urzatron work/secret_project % rails c
Loading development environment (Rails 3.1.3)
irb(main):001:0> t = Tag.new(:name => "!Blark!")
=> #<Tag id: nil, name: "!Blark!", created_at: nil, updated_at: nil>
irb(main):002:0> t.try(:name)
=> "!Blark!"
irb(main):003:0> t.try(:aoeu)
NoMethodError: undefined method `aoeu' for #<Tag id: nil, name: "!Blark!", created_at: nil, updated_at: nil>
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 `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
Tag
型号:
class Tag < ActiveRecord::Base
has_many :taggings, :dependent => :destroy
end
答案 0 :(得分:18)
你误解了try
的作用。来自fine manual:
尝试(* a,&amp; b)
调用符号method
标识的方法,传递任何参数和/或指定的块,就像常规的RubyObject#send
一样。与该方法不同,如果接收对象是
NoMethodError
对象,则nil
异常将不,并且将返回nil
NilClass。
这样做:
t.try(:aoeu)
或多或少与此相同:
t.nil?? nil : t.aoeu
但你似乎期望它表现得像这样:
t.respond_to?(:aoeu) ? t.aoeu : nil
t
不是nil
,因此t.try(:aoeu)
与t.aoeu
相同。您的代码类没有aoeu
方法,因此您获得了NoMethodError
。
try
只是一种避免nil
检查的便捷方式,当对象没有响应您所使用的方法时,它不是一种避免NoMethodError
的方法试图使用。