Rails 3 Object # попробовать не работает? - PullRequest
3 голосов
/ 02 января 2012

С чего мне начать искать?Вот что заставляет меня верить, что:

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

1 Ответ

18 голосов
/ 02 января 2012

Вы не понимаете, что делает try.Из точного руководства :

try (* a, & b)
Вызывает метод, обозначенный символом method, передавая его любомуаргументы и / или указанный блок, как это делает обычный Ruby Object#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.У вашего класса Tag нет метода aoeu, поэтому вы получаете NoMethodError.

try - это просто удобный способ избежать проверки nil, это не способ избежатьNoMethodError когда объект не отвечает на метод, который вы пытаетесь использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...