Class: RuboCop::Cop::Appdev::NoMassAssignment
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::Appdev::NoMassAssignment
- Defined in:
- lib/rubocop/cop/appdev/no_mass_assignment.rb
Overview
Forbids mass-assignment ActiveRecord APIs so authors demonstrate attribute-by-attribute assignment instead.
Scoped to ‘app/controllers/*/.rb` and `app/models/*/.rb` via `Include:` in default.yml. Combined with a receiver-shape heuristic to dodge false positives on `Hash#update`, `Array.new`, etc.
Class-method rules (‘.new` / `.create` / `.create!`):
flag only when receiver is a constant not in the `NonARConstants` allowlist.
Instance-method rules (‘.update` / `.update!` / `.assign_attributes` / `.attributes=`):
flag when receiver is an instance variable, or a local whose name
does not hint at a hash (`hash`, `map`, `dict`, `params`).
Constant Summary collapse
- MSG =
"Don't use `%<method>s` with arguments — assign attributes one at a time so students see each write."- CLASS_METHODS =
[:new, :create, :create!].freeze
- INSTANCE_METHODS =
[:update, :update!, :assign_attributes, :attributes=].freeze
- RESTRICT_ON_SEND =
(CLASS_METHODS + INSTANCE_METHODS).freeze
- NON_AR_LOCAL_PATTERN =
/hash|map|dict|params/i
Instance Method Summary collapse
Instance Method Details
#on_send(node) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/rubocop/cop/appdev/no_mass_assignment.rb', line 40 def on_send(node) return if node.arguments.empty? case node.method_name when *CLASS_METHODS return unless constant_receiver?(node.receiver) return if non_ar_constant?(node.receiver) when *INSTANCE_METHODS return unless likely_ar_instance?(node.receiver) end add_offense(node, message: format(MSG, method: node.method_name)) end |