提交 362203e8 编写于 作者: R Rafael Mendonça França

Merge pull request #14582 from arthurnn/blacklist_ruby_methods

Blacklist ruby keywords for scopes
* Block a few default Class methods as scope name.
For instance, this will raise:
scope :public, -> { where(status: 1) }
*arthurnn*
* Fixed error when using `with_options` with lambda.
Fixes #9805.
......
......@@ -29,6 +29,8 @@ def self.set_name_cache(name, value)
end
}
BLACKLISTED_CLASS_METHODS = %w(private public protected)
class AttributeMethodCache
def initialize
@module = Module.new
......@@ -132,7 +134,7 @@ def method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc:
# A class method is 'dangerous' if it is already (re)defined by Active Record, but
# not by any ancestors. (So 'puts' is not dangerous but 'new' is.)
def dangerous_class_method?(method_name)
class_method_defined_within?(method_name, Base)
BLACKLISTED_CLASS_METHODS.include?(method_name.to_s) || class_method_defined_within?(method_name, Base)
end
def class_method_defined_within?(name, klass, superklass = klass.superclass) # :nodoc
......
......@@ -194,6 +194,7 @@ class EnumTest < ActiveRecord::TestCase
:valid, # generates #valid?, which conflicts with an AR method
:save, # generates #save!, which conflicts with an AR method
:proposed, # same value as an existing enum
:public, :private, :protected, # generates a method that conflict with ruby words
]
conflicts.each_with_index do |value, i|
......
......@@ -291,6 +291,9 @@ def pro; end
:relation, # private class method on AR::Base
:new, # redefined class method on AR::Base
:all, # a default scope
:public,
:protected,
:private
]
non_conflicts = [
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册