webentwicklung-frage-antwort-db.com.de

Argumentfehler: Der Bereichskörper muss aufrufbar sein

Ich arbeite durch das "Ruby on Rails 3 Essential Training" und habe bei der Verwendung von Namensbereichen ein Problem erhalten. Beim Suchen von Datensätzen und beim Verwenden von Abfragen mit der Rails-Konsole verlief alles reibungslos, bis ich versuchte, einen Namensbereich in meiner subject.rb-Datei zu verwenden. Dies ist mein Code in der Datei subject.rb. 

Class Subject < ActiveRecord::Base

  scope :visible, where(:visible => true)

end   

Ich habe die .rb-Datei gespeichert und meine Rails-Konsole neu gestartet, aber wenn ich von meiner Rails-Konsole aus laufe:

subjects = Subject.visible

Ich erhalte: ArgumentError: The scope body needs to be callable.

Weiß jemand, warum ich diesen Fehler bekomme?.

39
Sam Gruse

Der Bereich des Gültigkeitsbereichs muss in etwas eingebettet sein, das wie Proc oder Lambda aufgerufen werden kann:

scope :visible, -> {
  where(:visible => true)
}

Der Grund dafür ist, dass sichergestellt wird, dass der Inhalt des Blocks bei jeder Verwendung des Gültigkeitsbereichs ausgewertet wird.

73
infused

Ja, in der Tat ist dies die Art und Weise von Rails 4, Bereiche zu nennen. Sie müssen dies ändern, wenn Sie von Rails 3 auf Rails 4 upgraden.

3
Pradeep S

Ich habe den gleichen Fehler erhalten, während vor meiner Lösung ein Leerzeichen zwischen where und ( wie unten angegeben war

scope :registered , -> { where ( place_id:  :place_id , is_registered: :true ) }

nachdem ich das Leerzeichen zwischen where und ( wie unten entfernt hatte, wurde meine Seite funktionsfähig 

scope :registered , -> { where( place_id:  :place_id , is_registered: :true ) }
3
ImranNaqvi

Was Sie verwenden: scope :visible, where(:visible => true) ist für eifrige Ladevorgänge gedacht und wurde in Rails 4 nicht mehr unterstützt.

scope :visible, where(:visible => true)

Diese Codezeile wird ausgewertet, wenn die betreffende Klasse geladen wird, und nicht zu dem Zeitpunkt, da diese scopeheißt.

Es gibt einige Fälle, in denen dieses Ding eine Rolle spielt, wie zum Beispiel:

scope :future, where('published_at > ?', Time.now)
scope :future, -> { where('published_at > ?', Time.now) }

Im ersten Fall wird ? durch den Zeitpunkt ersetzt, zu dem die Klasse geladen worden wäre. Im zweiten Fall wird jedoch der Zeitpunkt verwendet, zu dem der Gültigkeitsbereich für die Klasse aufgerufen wurde.

0
Arslan Ali