2012-01-02 10 views
3

どこから探し始めますか?ここで私はそれを信じて作るものです:Rails 3 Object#は動作しませんか?

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 

答えて

19

あなたはtryが何を誤解しています。 fine manualから:

試し(*、& B)
はそれを定期的にRubyのObject#sendがするよう任意の引数および/または指定されたブロックを、渡して、シンボルmethodで識別されるメソッドを呼び出します。その方法とは異なり

しかし、NoMethodError例外はない上昇され、受信オブジェクトがnilオブジェクトまたはNilClassある場合nilは、代わりに返されます。

だから、これを行う:

t.try(:aoeu) 

は、このよう多かれ少なかれ同じである:

t.nil?? nil : t.aoeu 

ができますが、それはこのように振る舞うことを期待しているように見える:

t.respond_to?(:aoeu) ? t.aoeu : nil 

tはではありません。t.try(:aoeu)t.aoeuと同じです。あなたのタグクラスにはaoeuメソッドがありませんので、NoMethodErrorが得られます。

tryがちょうどnilチェックを回避するための便利な方法ですが、それは、オブジェクトが使用しようとしているメソッドに応答しないときNoMethodErrorを回避する方法はありません。

+0

ありがとうございました。 。 。 。 。 –

関連する問題