Class: RuboCop::Cop::Rails::BelongsTo
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::Rails::BelongsTo
- Extended by:
- AutoCorrector, TargetRailsVersion
- Defined in:
- lib/rubocop/cop/rails/belongs_to.rb
Overview
Looks for belongs_to associations where we control whether the
association is required via the deprecated required
option instead.
Since Rails 5, belongs_to associations are required by default and this
can be controlled through the use of optional: true
.
From the release notes:
belongs_to will now trigger a validation error by default if the
association is not present. You can turn this off on a
per-association basis with optional: true. Also deprecate required
option in favor of optional for belongs_to. (Pull Request)
In the case that the developer is doing required: false
, we
definitely want to autocorrect to optional: true
.
However, without knowing whether they've set overridden the default
value of config.active_record.belongs_to_required_by_default
, we
can't say whether it's safe to remove required: true
or whether we
should replace it with optional: false
(or, similarly, remove a
superfluous optional: false
). Therefore, in the cases we're using
required: true
, we'll simply invert it to optional: false
and the
user can remove depending on their defaults.
Constant Summary collapse
- SUPERFLOUS_REQUIRE_FALSE_MSG =
'You specified `required: false`, in Rails > 5.0 the required ' \ 'option is deprecated and you want to use `optional: true`.'
- SUPERFLOUS_REQUIRE_TRUE_MSG =
'You specified `required: true`, in Rails > 5.0 the required ' \ 'option is deprecated and you want to use `optional: false`. ' \ 'In most configurations, this is the default and you can omit ' \ 'this option altogether'
- RESTRICT_ON_SEND =
%i[belongs_to].freeze
Constants included from TargetRailsVersion
TargetRailsVersion::USES_REQUIRES_GEM_API
Instance Method Summary collapse
Methods included from TargetRailsVersion
minimum_target_rails_version, support_target_rails_version?
Instance Method Details
#on_send(node) ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/rubocop/cop/rails/belongs_to.rb', line 73 def on_send(node) (node) do |option_node, option_value| , replacement = if option_value.true_type? [SUPERFLOUS_REQUIRE_TRUE_MSG, 'optional: false'] elsif option_value.false_type? [SUPERFLOUS_REQUIRE_FALSE_MSG, 'optional: true'] end add_offense(node.loc.selector, message: ) do |corrector| corrector.replace(option_node, replacement) end end end |