Sử dụng gem RuboCop trong Rails

Bạn hay bị comment lỗi convention khi gửi pull cho các trainer check?

Việc này xảy ra thường xuyên đặc biệt với các bạn mới bắt đầu thực hiện các project training đầu tiên với hàng chục comment chỉ về indent, rails convention, quá dòng...Vậy làm thế nào để mình có thể check các lỗi convention đó một cách dễ dàng mà không phải mất công rò soát lại mỗi khi gửi pull lên github?

Bài viết này mình giới thiệu về gem rubocop hỗ trợ việc check các lỗi convention trong code rails.

I. Cài đặt

Thêm vào Gemfile:

gem 'rubocop', '~> 0.46.0', require: false

chạy bundle để cài đặt gem.

II. Sử dụng

Trong terminal, bạn chỉ cần gõ rubocop, Rubocop sẽ duyệt các file để kiểm tra các lỗi convention và thông báo cho chúng ta biết lỗi đó là gì và ở đâu.

ví dụ:

phanbt@phanbt-Latitude-E6420:~/workspace/framgia_pmp$ rubocop
Warning: unrecognized cop Style/DeprecatedHashMethods found in /home/phanbt/workspace/framgia_pmp/.rubocop_enabled.yml
/home/phanbt/workspace/framgia_pmp/.rubocop.yml - AllCops/Excludes was renamed to AllCops/Exclude
Warning: unrecognized cop Style/DeprecatedHashMethods found in /home/phanbt/workspace/framgia_pmp/.rubocop.yml
Inspecting 126 files
....C...............C.............................C...........................................................................

Offenses:

app/helpers/application_helper.rb:26:24: C: Ternary operators must not be nested. Prefer if or else constructs instead.
      estimate != 0 ? (remaining != 0 ? "estimated" : "default") : "default"
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/helpers/application_helper.rb:28:24: C: Ternary operators must not be nested. Prefer if or else constructs instead.
      estimate != 0 ? (remaining != 0 ? "processed" : "default") : "assigned"
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
app/models/work_performance.rb:29:81: C: Line is too long. [83/80]
  scope :in_day, ->(phase, day){where phase_id: phase.id, master_sprint_id: day.id}
                                                                                ^^^
app/controllers/api/performances_table_controller.rb:9:81: C: Line is too long. [90/80]
        render partial: "work_performances/data", locals: {phase: phase, sprint: sprint}
                                                                                ^^^^^^^^^^

126 files inspected, 4 offenses detected

Rubocop thông báo lỗi rất rõ ràng, dễ hiểu. Như vậy, bạn chỉ cần tìm và sửa lại các lỗi trên là được.

III. Configuration

Về cơ bản, việc cài đặt như trên là ổn để dùng gem này rồi, nhưng nếu bạn muốn chỉnh sửa các cops(nguyên tắc) theo convention riêng của mình thì phải làm thế nào?

Mọi hành vi của rubocop có thể được điều khiển trong file .rubocop.yml. Nó có thể enable/disable các cops định nghĩa trong file.

Format của .rubocop.yml có dạng:

inherit_from: ../.rubocop.yml

Style/Encoding:
  Enabled: false

Metrics/LineLength:
  Max: 80
  • Một số từ khóa hay dùng trong các cops:

Include: chỉ check cops trong các file khai báo:

    Rails/ScopeArgs:
      Include:
        - app/models/**/*.rb

    Rails/Validation:
      Include:
        - app/models/**/*.rb
`Exclude`: check cops ngoại trừ các file khai báo:
    Style/FileName:
      Exclude:
        - '**/Rakefile'
        - '**/Gemfile'
        - '**/Capfile'

Enabled: Cài đặt trạng thái cho cops, bỏ qua cops nếu false, check cops nếu true.

    Metrics/MethodLength:
      Description: "Avoid methods longer than 10 lines of code."
      Enabled: false
    Style/EmptyLines:
      Description: "Don't use several empty lines in a row."
      Enabled: true

Rất mong bài viết này sẽ giúp các bạn nhẹ nhàng hơn trong việc tìm và sửa các lỗi convention trong code của mình.

Thanks for read!

Link tham khảo:

https://github.com/bbatsov/rubocop/blob/master/manual/configuration.md


All Rights Reserved