class RuboCop::Cop::Rails::DynamicFindBy
This cop checks dynamic `find_by_*` methods. Use `find_by` instead of dynamic method. See. github.com/rubocop-hq/rails-style-guide#find_by
@example
# bad User.find_by_name(name) # bad User.find_by_name_and_email(name) # bad User.find_by_email!(name) # good User.find_by(name: name) # good User.find_by(name: name, email: email) # good User.find_by!(email: email)
Constants
- METHOD_PATTERN
- MSG
Public Instance Methods
autocorrect(node)
click to toggle source
# File lib/rubocop/cop/rails/dynamic_find_by.rb, line 47 def autocorrect(node) keywords = column_keywords(node.method_name) return if keywords.size != node.arguments.size lambda do |corrector| autocorrect_method_name(corrector, node) autocorrect_argument_keywords(corrector, node, keywords) end end
on_send(node)
click to toggle source
# File lib/rubocop/cop/rails/dynamic_find_by.rb, line 32 def on_send(node) method_name = node.method_name.to_s return if whitelist.include?(method_name) static_name = static_method_name(method_name) return unless static_name add_offense(node, message: format(MSG, static_name: static_name, method: node.method_name)) end
Also aliased as: on_csend
Private Instance Methods
autocorrect_argument_keywords(corrector, node, keywords)
click to toggle source
# File lib/rubocop/cop/rails/dynamic_find_by.rb, line 65 def autocorrect_argument_keywords(corrector, node, keywords) keywords.each.with_index do |keyword, idx| corrector.insert_before(node.arguments[idx].loc.expression, keyword) end end
autocorrect_method_name(corrector, node)
click to toggle source
# File lib/rubocop/cop/rails/dynamic_find_by.rb, line 60 def autocorrect_method_name(corrector, node) corrector.replace(node.loc.selector, static_method_name(node.method_name.to_s)) end
column_keywords(method)
click to toggle source
# File lib/rubocop/cop/rails/dynamic_find_by.rb, line 75 def column_keywords(method) keyword_string = method.to_s[METHOD_PATTERN, 1] keyword_string.split('_and_').map { |keyword| "#{keyword}: " } end
static_method_name(method_name)
click to toggle source
Returns static method name. If code isn't wrong, returns nil
# File lib/rubocop/cop/rails/dynamic_find_by.rb, line 82 def static_method_name(method_name) match = METHOD_PATTERN.match(method_name) return nil unless match match[2] ? 'find_by!' : 'find_by' end
whitelist()
click to toggle source
# File lib/rubocop/cop/rails/dynamic_find_by.rb, line 71 def whitelist cop_config['Whitelist'] end