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

Я работаю над "Основой обучения по 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) }

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

Другие вопросы по тегам