I'm working through the 'Ruby On Rails 3 Essential Training' and have received a problem when using name scopes. When finding records and using queries withing the Rails console everything went smoothly until I tried to use a name scope in my subject.rb file. This is my code in the subject.rb file.
Class Subject < ActiveRecord::Base
scope :visible, where(:visible => true)
end
I saved the .rb file and restarted my Rails console but when I run from my rails console:
subjects = Subject.visible
I get: ArgumentError: The scope body needs to be callable.
Does anyone know why I'm getting this error.
The scope's body needs to be wrapped in something callable like a Proc or Lambda:
The reason for this is that it ensures the contents of the block is evaluated each time the scope is used.
Yes, indeed, this is rails 4 way of calling scopes. You'd need to change it, if you're upgrading to Rails 4 from Rails 3.
I got the same error , while before my solution I had a space between
where
and(
like belowafter i removed the space between
where
and(
like below i made my page workingWhat you are using:
scope :visible, where(:visible => true)
goes for eager loading, and has been deprecated in Rails 4.This line of code gets evaluated when the particular class is loaded, and not at the time, this very
scope
is called.There are a few cases when this thing does matter, like:
In first case,
?
will be replaced with the very time the class would have been loaded, but the second & correct case, that time will be used at which the scope would have been called on the class.