Class: RuboCop::Cop::Rails::HttpStatus

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
ConfigurableEnforcedStyle
Defined in:
lib/rubocop/cop/rails/http_status.rb

Overview

Enforces use of symbolic or numeric value to define HTTP status.

Examples:

EnforcedStyle: symbolic (default)

# bad
render :foo, status: 200
render :foo, status: '200'
render json: { foo: 'bar' }, status: 200
render plain: 'foo/bar', status: 304
redirect_to root_url, status: 301
head 200
assert_response 200
assert_redirected_to '/some/path', status: 301

# good
render :foo, status: :ok
render json: { foo: 'bar' }, status: :ok
render plain: 'foo/bar', status: :not_modified
redirect_to root_url, status: :moved_permanently
head :ok
assert_response :ok
assert_redirected_to '/some/path', status: :moved_permanently

EnforcedStyle: numeric

# bad
render :foo, status: :ok
render json: { foo: 'bar' }, status: :not_found
render plain: 'foo/bar', status: :not_modified
redirect_to root_url, status: :moved_permanently
head :ok
assert_response :ok
assert_redirected_to '/some/path', status: :moved_permanently

# good
render :foo, status: 200
render json: { foo: 'bar' }, status: 404
render plain: 'foo/bar', status: 304
redirect_to root_url, status: 301
head 200
assert_response 200
assert_redirected_to '/some/path', status: 301

Defined Under Namespace

Classes: NumericStyleChecker, SymbolicStyleChecker

Constant Summary collapse

RESTRICT_ON_SEND =
%i[render redirect_to head assert_response assert_redirected_to].freeze

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/rubocop/cop/rails/http_status.rb', line 67

def on_send(node)
  http_status(node) do |hash_node_or_status_code|
    status = if hash_node_or_status_code.hash_type?
               status_code(hash_node_or_status_code)
             else
               hash_node_or_status_code
             end
    return unless status

    checker = checker_class.new(status)
    return unless checker.offensive?

    add_offense(checker.node, message: checker.message) do |corrector|
      corrector.replace(checker.node, checker.preferred_style)
    end
  end
end