web-dev-qa-db-ja.com

引数エラー:スコープ本体は呼び出し可能にする必要があります

私は「Ruby on Rails 3 Essential Training」に取り組んでいます。名前スコープを使用すると問題が発生します。レコードを検索し、Rails = subject.rbファイルで名前スコープを使用しようとするまで、すべてがスムーズに進みました。これがsubject.rbファイルのコードです。

Class Subject < ActiveRecord::Base

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

end   

.rbファイルを保存し、Rails consoleを再起動しましたが、Rails console:

subjects = Subject.visible

取得:ArgumentError: The scope body needs to be callable.

このエラーが発生する理由を誰もが知っていますか?.

39
Sam Gruse

スコープの本体は、ProcやLambdaなどの呼び出し可能なものでラップする必要があります。

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

これは、スコープが使用されるたびにブロックの内容が評価されるようにするためです。

74
infused

はい、確かに、これはRailsスコープを呼び出す4つの方法です。 Rails 3からRails 4にアップグレードする場合は、変更する必要があります。

3
Pradeep S

私は同じエラーを受け取りましたが、ソリューションの前に次のようにwhere(の間にスペースがありました

scope :registered , -> { where ( place_id:  :place_id , is_registered: :true ) }

以下のようにwhere(の間のスペースを削除した後、ページを機能させました

scope :registered , -> { where( place_id:  :place_id , is_registered: :true ) }
3
ImranNaqvi

使用しているもの: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) }

最初の場合、?は、クラスがロードされたまさにその時刻に置き換えられますが、2番目の正しいケースでは、その時刻がクラスでスコープが呼び出されたときに使用されます。

0
Arslan Ali