Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Ensure dynamic finders are anchored to the beginning of the method na…

…me to prevent

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@5795 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 58edaaad0bc32a4b190329dcc8fb0e3bb1869c46 1 parent 014fdde
@NZKoz NZKoz authored
View
4 activerecord/lib/active_record/base.rb
@@ -1187,7 +1187,7 @@ def undecorated_table_name(class_name = base_class.name)
# It's even possible to use all the additional parameters to find. For example, the full interface for find_all_by_amount
# is actually find_all_by_amount(amount, options).
def method_missing(method_id, *arguments)
- if match = /find_(all_by|by)_([_a-zA-Z]\w*)/.match(method_id.to_s)
+ if match = /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match(method_id.to_s)
finder, deprecated_finder = determine_finder(match), determine_deprecated_finder(match)
attribute_names = extract_attribute_names_from_match(match)
@@ -1219,7 +1219,7 @@ def method_missing(method_id, *arguments)
send(deprecated_finder, sanitize_sql(attributes), *arguments[attribute_names.length..-1])
end
end
- elsif match = /find_or_(initialize|create)_by_([_a-zA-Z]\w*)/.match(method_id.to_s)
+ elsif match = /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/.match(method_id.to_s)
instantiator = determine_instantiator(match)
attribute_names = extract_attribute_names_from_match(match)
super unless all_attributes_exists?(attribute_names)
View
7 activerecord/test/finder_test.rb
@@ -293,6 +293,13 @@ def test_find_by_one_attribute_with_several_options
def test_find_by_one_missing_attribute
assert_raises(NoMethodError) { Topic.find_by_undertitle("The First Topic!") }
end
+
+ def test_find_by_invalid_method_syntax
+ assert_raises(NoMethodError) { Topic.fail_to_find_by_title("The First Topic") }
+ assert_raises(NoMethodError) { Topic.find_by_title?("The First Topic") }
+ assert_raises(NoMethodError) { Topic.fail_to_find_or_create_by_title("Nonexistent Title") }
+ assert_raises(NoMethodError) { Topic.find_or_create_by_title?("Nonexistent Title") }
+ end
def test_find_by_two_attributes
assert_equal topics(:first), Topic.find_by_title_and_author_name("The First Topic", "David")
Please sign in to comment.
Something went wrong with that request. Please try again.