Ошибка аргумента: тело области действия должно быть вызвано
Я работаю над "Ruby On Rails 3 Essential Training" и получил проблему при использовании областей имен. При поиске записей и использовании запросов с консолью 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.
Кто-нибудь знает, почему я получаю эту ошибку.
Ответы
Ответ 1
Тело области видимости должно быть обернуто во что-то вызываемое, например, Proc или Lambda:
scope :visible, -> {
where(:visible => true)
}
Причина этого заключается в том, что он гарантирует, что содержимое блока оценивается каждый раз, когда используется область.
Ответ 2
Да, действительно, это рельсы 4 способа вызова областей. Вам нужно будет изменить его, если вы обновляете Rails 4 из Rails 3.
Ответ 3
Я получил ту же ошибку, в то время как до моего решения у меня был пробел между where
и (
как показано ниже
scope :registered , -> { where ( place_id: :place_id , is_registered: :true ) }
после того, как я удалил пробел между where
и (
как показано ниже, я сделал мою страницу работающей
scope :registered , -> { where( place_id: :place_id , is_registered: :true ) }
Ответ 4
То, что вы используете: 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) }
В первом случае ?
будет заменен тем временем, когда класс был бы загружен, но второй и правильный случай, это время будет использоваться, при котором область была бы вызвана в классе.