Подтвердить что ты не робот

Ошибка аргумента: тело области действия должно быть вызвано

Я работаю над "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.

Кто-нибудь знает, почему я получаю эту ошибку.

4b9b3361

Ответ 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) }

В первом случае ? будет заменен тем временем, когда класс был бы загружен, но второй и правильный случай, это время будет использоваться, при котором область была бы вызвана в классе.