aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-10-27 09:18:06 +0100
committerYves Senn <yves.senn@gmail.com>2014-10-27 09:49:50 +0100
commitd616fec8117ac25753ee23e15ac14261d298ee51 (patch)
tree4d9f0e788f43518c483f25059fbbf3f59af6fb16
parentffed7acd8eed3bc3219aad7828a54b1f2c03bfaf (diff)
parentb570b6b1768f4e89b4f21526763cae77c2ff03fe (diff)
downloadrails-d616fec8117ac25753ee23e15ac14261d298ee51.tar.gz
rails-d616fec8117ac25753ee23e15ac14261d298ee51.tar.bz2
rails-d616fec8117ac25753ee23e15ac14261d298ee51.zip
Merge pull request #17374 from maurogeorge/scope-exception
Raises ArgumentError when try to define a scope without a callable
-rw-r--r--activerecord/CHANGELOG.md4
-rw-r--r--activerecord/lib/active_record/scoping/named.rb4
-rw-r--r--activerecord/test/cases/scoping/named_scoping_test.rb7
3 files changed, 15 insertions, 0 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index cab413d4c3..79dc390f0a 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,7 @@
+* Raise `ArgumentError` when the body of a scope is not callable.
+
+ *Mauro George*
+
* Use type column first in multi-column indexes created with `add-reference`.
*Derek Prior*
diff --git a/activerecord/lib/active_record/scoping/named.rb b/activerecord/lib/active_record/scoping/named.rb
index 49cadb66d0..ec1edf0e01 100644
--- a/activerecord/lib/active_record/scoping/named.rb
+++ b/activerecord/lib/active_record/scoping/named.rb
@@ -139,6 +139,10 @@ module ActiveRecord
# Article.published.featured.latest_article
# Article.featured.titles
def scope(name, body, &block)
+ unless body.respond_to?:call
+ raise ArgumentError, 'The scope body needs to be callable.'
+ end
+
if dangerous_class_method?(name)
raise ArgumentError, "You tried to define a scope named \"#{name}\" " \
"on the model \"#{self.name}\", but Active Record already defined " \
diff --git a/activerecord/test/cases/scoping/named_scoping_test.rb b/activerecord/test/cases/scoping/named_scoping_test.rb
index d3546bd471..c2816c3670 100644
--- a/activerecord/test/cases/scoping/named_scoping_test.rb
+++ b/activerecord/test/cases/scoping/named_scoping_test.rb
@@ -132,6 +132,13 @@ class NamedScopingTest < ActiveRecord::TestCase
assert_equal Post.ranked_by_comments.limit_by(5), Post.top(5)
end
+ def test_scopes_body_is_a_callable
+ e = assert_raises ArgumentError do
+ Class.new(Post).class_eval { scope :containing_the_letter_z, where("body LIKE '%z%'") }
+ end
+ assert_equal "The scope body needs to be callable.", e.message
+ end
+
def test_active_records_have_scope_named__all__
assert !Topic.all.empty?