Ошибка аргумента: тело области должно быть вызываемым
Я работаю над "Основой обучения по Ruby On Rails 3" и получил проблему при использовании областей имен. При поиске записей и использовании запросов в консоли Rails все шло гладко, пока я не попытался использовать область имен в моем файле subject.rb. Это мой код в файле subject.rb.
Class Subject < ActiveRecord::Base
scope :visible, where(:visible => true)
end
Я сохранил файл.rb и перезапустил консоль Rails, но при запуске из консоли rails:
subjects = Subject.visible
Я получил: ArgumentError: The scope body needs to be callable.
Кто-нибудь знает, почему я получаю эту ошибку.
4 ответа
Тело прицела должно быть обернуто во что-то, что можно вызвать как Proc или Lambda:
scope :visible, -> {
where(:visible => true)
}
Причина этого заключается в том, что он гарантирует, что содержимое блока оценивается каждый раз, когда используется область.
Я получил ту же ошибку, в то время как до моего решения у меня было пространство между where
а также (
как ниже
scope :registered , -> { where ( place_id: :place_id , is_registered: :true ) }
после того как я удалил пространство между where
а также (
как показано ниже, я сделал мою страницу работающей
scope :registered , -> { where( place_id: :place_id , is_registered: :true ) }
Да, действительно, это рельсы 4 способа вызова прицелов. Вам нужно будет изменить его, если вы переходите на Rails 4 с Rails 3.
Что вы используете: scope :visible, where(:visible => true)
идет на энергичную загрузку и устарела в Rails 4.
scope :visible, where(:visible => true)
Эта строка кода оценивается, когда загружается определенный класс, а не во время, это очень scope
называется.
Есть несколько случаев, когда эта вещь имеет значение, например:
scope :future, where('published_at > ?', Time.now)
scope :future, -> { where('published_at > ?', Time.now) }
В первом случае ?
будет заменено тем временем, когда класс был бы загружен, но во втором и правильном случае это время будет использовано, когда область будет вызвана для класса.