Class: RuboCop::Cop::DevDoc::Style::AvoidHeadResponse
- Inherits:
-
Base
- Object
- Base
- RuboCop::Cop::DevDoc::Style::AvoidHeadResponse
- Defined in:
- lib/rubocop/cop/dev_doc/style/avoid_head_response.rb
Overview
Avoid ‘head()` with error status codes in controllers.
## Rationale Using ‘head()` for error responses returns an empty body with no useful information for the client. Error handling should be delegated to Rails exceptions (e.g. `ActiveRecord::RecordNotFound`) or model validations instead, which give the client more context.
Success statuses like ‘:ok`, `:no_content`, and `:accepted` are legitimate uses of `head()` and are not flagged.
The set of flagged statuses is configurable via ‘FlaggedStatuses:`.
❌ Manually returns 404 with no body
def show
@user = User.find_by(id: params[:id])
head(:not_found) unless @user
end
✔️ Let Rails raise RecordNotFound — it renders the standard 404
def show
@user = User.find(params[:id])
end
✔️ Success response — empty body is correct here
def destroy
@resource.destroy!
head :no_content
end
Constant Summary collapse
- MSG =
'Avoid `head(%<status>s)` for error handling. ' \ 'Delegate to Rails exceptions or model validations instead.'.freeze
- RESTRICT_ON_SEND =
%i[head].freeze
- DEFAULT_FLAGGED_STATUSES =
%w[ not_found unprocessable_entity forbidden unauthorized bad_request conflict gone method_not_allowed 404 422 403 401 400 409 410 405 ].freeze
Instance Method Summary collapse
Instance Method Details
#on_send(node) ⇒ Object
62 63 64 65 66 67 68 69 70 |
# File 'lib/rubocop/cop/dev_doc/style/avoid_head_response.rb', line 62 def on_send(node) return unless node.receiver.nil? status_node = node.arguments.first return unless status_node return unless flagged_literal?(status_node) add_offense(node.loc.selector, message: format(MSG, status: status_display(status_node))) end |