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?.
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.
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.
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 ) }
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 scope
heiß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.