Rails 3对象#尝试不起作用?

Dea*_*age 3 ruby-on-rails ruby-on-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!")
=> #<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>'
Run Code Online (Sandbox Code Playgroud)

Tag模型:

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 18

你误解了什么try.从精细手册:

try(*a,&b)
调用符号标识的方法method,传递任何参数和/或指定的块,就像常规Ruby Object#send一样.

但是,与该方法不同,如果接收对象是对象或NilClass ,则不会引发NoMethodError异常并将返回异常.nilnil

这样做:

t.try(:aoeu)
Run Code Online (Sandbox Code Playgroud)

或多或少与此相同:

t.nil?? nil : t.aoeu
Run Code Online (Sandbox Code Playgroud)

但你似乎期待它表现得像这样:

t.respond_to?(:aoeu) ? t.aoeu : nil
Run Code Online (Sandbox Code Playgroud)

t不是nil这样t.try(:aoeu)t.aoeu.你的Tag类没有aoeu方法,所以你得到了一个NoMethodError.

try这只是避免nil检查的一种方便方法,它不是避免NoMethodError在对象不响应您尝试使用的方法时的方法.