2015-03-09 5 views
37

Я работаю над «Ruby On Rails 3 Essential Training» и получил проблему при использовании областей имен. При поиске записей и использовании запросов с консолью Rails все прошло гладко, пока я не попытался использовать область имени в файле subject.rb. Это мой код в файле subject.rb.Ошибка аргумента: тело области видимости должно быть вызвано

Class Subject < ActiveRecord::Base 

    scope :visible, where(:visible => true) 

end 

Я сохранил .RB файл и перезапустить мой Rails консоль, но когда я бег из моих рельсов консоли:

subjects = Subject.visible 

я получаю: ArgumentError: The scope body needs to be callable.

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

ответ

66

Тела осциллографа должно завернутым в чем-то вызываемом как Proc или Lambda:

scope :visible, -> { 
    where(:visible => true) 
} 

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

+0

Хорошо, это имеет смысл, и я не могу дождаться, чтобы попробовать завтра утром, чтобы продолжить учиться. Спасибо за быстрый ответ. Любые догадки о том, почему преподаватель не использовал никаких оберток в своем примере. Казалось, он работал с ним. Я также заметил, что в новейшей версии рубина не используется маркировка «self.up» «self.down». Инструктор сказал, что рубину не нужно, чтобы в новых версиях, но я должен был включить его, чтобы сделать миграцию. Это становится запутанным, когда существуют разные версии рельсов, поскольку учебные видеоролики были сделаны. Еще раз спасибо. –

+0

Спасибо за ваш ответ, он отлично работал! –

+0

@SamGruse это Rails 4 способ сделать это, курс, кажется, использует Rails 3 – reillyse

1

Да, действительно, это рельсы 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) } 
0

Что вы используете: 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) } 

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