Schienen versuchen, die Methode zu werfen NoMethodError?
Warum versuchen Sie werfen einen Fehler? Nicht, dass die Niederlage der ganze Zweck? Vielleicht ist es nur in der Konsole?
ruby-1.9.2-p180 :101 > User.first.try(:something)
NoMethodError: undefined method `something' for #<User:0x000001046ad128>
from /Users/me/.rvm/gems/ruby-1.9.2-p180/gems/activemodel-3.0.10/lib/active_model/attribute_methods.rb:392:in `method_missing'
from /Users/me/.rvm/gems/ruby-1.9.2-p180/gems/activerecord-3.0.10/lib/active_record/attribute_methods.rb:46:in `method_missing'
from (irb):101
from /Users/me/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start'
from /Users/me/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start'
from /Users/me/.rvm/gems/ruby-1.9.2-p180/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
EDIT:
Danke Jungs, jetzt bekomme ich es.
Gibt es eine Möglichkeit, das zu tun, was ich wollte, ohne dabei mit respond_to?
, so dass User.try(:something)
zurück nil
er wirft den Fehler?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rails 3
Verkennst du, wie
try
funktioniert, von der Handbuch:Und die version von
try
, die angepasst ist, um inNilClass
:So
try
nicht ignorieren, Ihr Versuch zum Aufruf einer nicht-existenten Methode auf ein Objekt, wird es ignoriert Ihren Versuch, eine Methode aufzurufen, die aufnil
und zurücknil
anstatt eine Ausnahme. Dietry
- Methode ist ein einfacher Weg, um zu vermeiden, dass zu prüfennil
bei jedem Schritt in einer Kette von Methodenaufrufen.Schienen 4
Das Verhalten von
try
hat sich in den Schienen 4, so dass es jetzt:So, jetzt
try
kümmert sich um beide Prüfungen auf einmal. Wenn Sie möchten, dass die Rails-3-Verhalten, es istversuche!
:try
wird jetzt nicht ausgelöst, wenn die Methode fehlt allerdingstry!
erheben, wenn die Methode fehlt. Siehe github.com/rails/rails/commit/...Dies ist, was versuchen tut
So, sagen wir mal Sie setup
@user
im controller, aber du hast nicht instanziieren es dann@user.try(:foo)
statt=> nil
Der wichtige Punkt hier ist, dass Sie versuchen können, ist eine Instanz-Methode. Es auch keine Rückgabe nil, wenn das Objekt, das Sie versuchen auf nicht null.
User.column_names.include?("name")
oder@u.attributes.has_key?("name")
Ich weiß, das ist alt, aber es kann helfen, jemand anderes, denn das ist das erste, was aufgetaucht ist, wenn ich Googeln dieses Problem. Ich "lieh" den code für versuchen und umgesetzt, meine eigenen try_method Methode, die verhält sich genau wie versuchen, außer, dass es zuerst prüft, um zu sehen, ob die Methode vorhanden ist, vor der Berufung senden. Implementiert habe ich dies in Objekt und steckte es in einen Initialisierer, und jetzt kann ich es nennen, auf ein Objekt.