К основному содержанию
правило

ruby — правило для Cursor: стандарты Ruby и Rails

Правило для Cursor задаёт команде единый стиль Ruby: RuboCop, соглашения Rails, работа с N+1 и защита от SQL-инъекций.

Установить в Cursor · Вручную: положить файлы Все способы и платформы ↓
.cursor/rules/ruby.mdc
Открыть на GitHub

Что делает ruby

Файл .cursor/rules/ruby.mdc подключается к Cursor и начинает действовать на все файлы проекта. Внутри — набор требований: один класс или модуль на файл, имена в snake_case и CamelCase, отступ в два пробела, строки до 120 символов, один перевод строки в конце файла. Каждое правило идёт с парой примеров: как не надо и как надо.

Отдельные разделы — про идиомы и производительность. Блочная запись &:method_name, guard clauses вместо вложенных if, именованные аргументы, проброс через ... в Ruby 3.0+. Для Rails — includes против N+1, мемоизация через ||=, strong parameters и параметризованные запросы вместо подстановки строк. Есть и обработка ошибок: свои классы исключений и rescue с указанием типа.

Правило опирается на RuboCop и официальные стайлгайды Ruby и Rails, поэтому расхождения с уже настроенным .rubocop.yml будут всплывать при каждой проверке. Логика в том, что линтер и правило тянут в одну сторону. Если в проекте намеренно отключены какие-то копы, ждите шума в отчётах.

Какие задачи решает

  • договориться о стиле Ruby внутри команды
  • убрать N+1 запросы в Rails
  • закрыть массовое присваивание через strong parameters
  • переписать вложенные условия на guard clauses
  • заменить интерполяцию в SQL на параметры

Примеры запросов агенту

  • проверь этот контроллер по правилам ruby
  • перепиши метод с учётом ruby-правила
  • пройдись по сервисам и убери N+1 по правилу ruby

Как установить ruby

Вручную: положить файлы

.cursor/rules/ruby.mdc

Во frontmatter: description, globs, alwaysApply

По шагам, с командами для каждой платформы: Cursor rules: файлы .mdc, четыре режима и замена .cursorrules

Из того же набора69

solidity Правило задаёт стиль и требования к Solidity-коду: фиксированный pragma, кастомные ошибки, защита от реентрантности. Пригодится, когда пишете контракты в Cursor. ★ 3 579звёзд репо shadcn Правило для Cursor задаёт команде единый стиль работы с shadcn/ui: структура папок, типы, варианты через CVA, формы на React Hook Form и Zod. Пригодится, когда компонентов становится много. ★ 3 579звёзд репо sentry Правило задаёт, как инициализировать Sentry в проекте: где ставить SDK, какие переменные окружения использовать, как не сломать чужой код. ★ 3 579звёзд репо scikit-image Правило задаёт команде единый стиль работы с scikit-image: неизменяемость входных массивов, float-диапазон [0, 1], векторизация вместо циклов по пикселям. ★ 3 579звёзд репо riverpod Правило для Cursor задаёт команде единый стиль работы с Riverpod в Flutter: где держать провайдеры, когда ref.watch, а когда ref.read. ★ 3 579звёзд репо react Правило для Cursor задаёт команде единые стандарты React: чистые компоненты, правила хуков, структура по фичам. Пригодится, когда в проекте несколько разработчиков и ИИ-агент пишет код вразнобой. ★ 3 579звёзд репо react-native Правило задаёт обязательные практики для React Native: feature-first структуру, функциональные компоненты, хуки и типизацию. Пригодится, когда проект растёт и файлы расползаются. ★ 3 579звёзд репо qwik Правило Cursor, которое подсказывает агенту, как писать Qwik-приложения: component$, useStore, QRL с суффиксом $ и загрузка данных через loader$. ★ 3 579звёзд репо

Похожие

ruby-mcp-server-generator официальный github Создаёт каркас MCP-сервера на Ruby с официальным SDK. Подходит, когда нужны инструменты, промпты, ресурсы и тесты в одном проекте. 8 600установок sentry-ruby-sdk getsentry Пошагово настраивает отслеживание ошибок и трейсинг Sentry в Ruby-приложениях. Помогает быстро перейти с других систем мониторинга. CX Codex +1 2 100установок ruby-rails Mindrally Скилл задаёт агенту правила разработки на Ruby on Rails: генераторы, ActiveRecord, Hotwire, фоновые задачи и тесты. Пригодится, когда проект уже на Rails или только заводится. CX Codex +1 862установок appwrite-ruby appwrite Подсказывает агенту, как работать с Appwrite из Ruby: пользователи, таблицы, файлы, команды. Пригодится в Rails и Sinatra. CX Codex +1 796установок ruby-rails-application aj-geddes Помогает создавать приложения на Ruby on Rails по архитектуре MVC. Настраивает модели Active Record, REST-контроллеры, JWT-аутентификацию и миграции базы данных. CX Codex +1 655установок ruby-mcp-development официальный Awesome Copilot Community Собирает MCP-серверы на Ruby через официальный MCP Ruby SDK gem, с поддержкой Rails. Пригодится, когда нужно поднять сервер для инструментов и ресурсов агента. ★ 40 418звёзд репо

Рядом в теме «Языки программирования»

Все правила IDE по теме «Языки программирования» →

Вопросы о ruby

Как установить ruby в Cursor?

Создайте файл .cursor/rules/ruby.mdc в корне проекта и вставьте в него содержимое правила. Cursor подхватит его автоматически.

Что делает это правило?

Задаёт агенту стандарты Ruby и Rails: именование, форматирование, идиомы, работу с запросами и обработку ошибок. Агент сверяется с ним при генерации и правке кода.

Нужен ли RuboCop?

Правило написано под RuboCop и официальные стайлгайды Ruby и Rails. Если в проекте свои настройки линтера, проверьте, что они не спорят с этими требованиями.

Исходный текст

ruby.mdc · CC0-1.0
---
description: This guide provides opinionated, actionable best practices for writing modern Ruby code, focusing on maintainability, performance, and security, with a strong emphasis on RuboCop and Rails conventions.
globs: **/*
---
# Ruby Best Practices

Our team adheres to a strict set of Ruby best practices, primarily enforced by RuboCop and aligned with the official Ruby and Rails Style Guides. This document serves as your definitive reference for writing clean, efficient, and maintainable Ruby code.

## 1. Code Organization & Structure

Adhere to the Single Responsibility Principle (SRP) and keep files focused.

### 1.1 Single Class/Module Per File
Each Ruby file must define a single class or module. Name the file using `snake_case` corresponding to the `CamelCase` class/module name.

❌ BAD
```ruby
# user.rb
class User; end
class UserProfile; end
```

✅ GOOD
```ruby
# user.rb
class User; end

# user_profile.rb
class UserProfile; end
```

### 1.2 Rails Directory Structure
Follow Rails' "convention over configuration" for project structure.

❌ BAD
```ruby
# app/services/user_management/create_user.rb
# app/validators/email_validator.rb
```

✅ GOOD
```ruby
# app/services/user_management/create_user.rb (for complex logic)
# app/validators/email_validator.rb (standard Rails convention)
```

### 1.3 Configuration Files
Place custom initialization code in `config/initializers`. Keep gem-specific initializers in separate files named after the gem.

❌ BAD
```ruby
# config/initializers/app_setup.rb
# Contains setup for CarrierWave, Sidekiq, and custom app config.
```

✅ GOOD
```ruby
# config/initializers/carrierwave.rb
# config/initializers/sidekiq.rb
# config/initializers/custom_app_config.rb
```

## 2. Formatting

Consistency is paramount. RuboCop enforces these rules automatically.

### 2.1 Indentation & Line Length
Use two-space soft tabs. Limit lines to 120 characters to balance readability and screen real estate.

❌ BAD
```ruby
def long_method_name(param1, param2, param3, param4, param5, param6, param7) # > 120 chars
    puts "This line is indented with four spaces."
end
```

✅ GOOD
```ruby
def long_method_name(param1, param2, param3, param4, param5, param6, param7)
  puts "This line is indented with two spaces."
end
```

### 2.2 Trailing Whitespace & Newlines
Remove all trailing whitespace. End every file with a single newline.

❌ BAD
```ruby
puts "Hello"  # Trailing spaces
# No newline at EOF
```

✅ GOOD
```ruby
puts "Hello"
# Single newline at EOF
```

## 3. Naming Conventions

Strictly follow Ruby community standards for naming.

### 3.1 Variables, Methods, Files
Use `snake_case`. Do not separate numbers from letters.

❌ BAD
```ruby
someVar = 1
def someMethod; end
HelloWorld.rb
```

✅ GOOD
```ruby
some_var = 1
def some_method; end
hello_world.rb
```

### 3.2 Classes & Modules
Use `CamelCase`.

❌ BAD
```ruby
class Some_Class; end
```

✅ GOOD
```ruby
class SomeClass; end
```

### 3.3 Constants
Use `SCREAMING_SNAKE_CASE`. Freeze mutable constants.

❌ BAD
```ruby
SomeConst = 5
ALL_COLORS = ['red', 'blue']
```

✅ GOOD
```ruby
SOME_CONST = 5
ALL_COLORS = ['RED', 'BLUE'].freeze
```

### 3.4 Predicate & Bang Methods
Predicate methods (return boolean) end with `?`. Methods with side effects or that raise exceptions end with `!`.

❌ BAD
```ruby
def is_valid; end
def save_record; end # if it raises on failure
```

✅ GOOD
```ruby
def valid?; end
def save_record!; end # raises ActiveRecord::RecordInvalid on failure
```

## 4. Common Patterns & Anti-patterns

Embrace idiomatic Ruby and Rails patterns.

### 4.1 Block Shorthand
Use `&:method_name` for simple blocks.

❌ BAD
```ruby
names.map { |name| name.upcase }
```

✅ GOOD
```ruby
names.map(&:upcase)
```

### 4.2 Conditional Guards
Prefer guard clauses to reduce nesting.

❌ BAD
```ruby
def process_data(data)
  if data
    if data.valid?
      # ... process ...
    else
      log_error("Invalid data")
    end
  else
    log_error("No data provided")
  end
end
```

✅ GOOD
```ruby
def process_data(data)
  return log_error("No data provided") unless data
  return log_error("Invalid data") unless data.valid?

  # ... process ...
end
```

### 4.3 Keyword Arguments
Use keyword arguments for clarity and flexibility, especially for methods with many parameters.

❌ BAD
```ruby
def create_user(name, email, role = 'guest')
  # ...
end
create_user('Alice', '[email protected]', 'admin')
```

✅ GOOD
```ruby
def create_user(name:, email:, role: 'guest')
  # ...
end
create_user(name: 'Alice', email: '[email protected]', role: 'admin')
```

### 4.4 Argument Forwarding
Use `...` for forwarding arguments in Ruby 3.0+.

❌ BAD
```ruby
def wrapper(*args, **kwargs, &block)
  target_method(*args, **kwargs, &block)
end
```

✅ GOOD
```ruby
def wrapper(...)
  target_method(...)
end
```

## 5. Performance Considerations

Write efficient code, especially when dealing with collections or database queries.

### 5.1 Eager Loading (Rails)
Prevent N+1 query issues by eager loading associations.

❌ BAD
```ruby
users = User.all
users.each { |user| puts user.posts.count } # N+1 query
```

✅ GOOD
```ruby
users = User.includes(:posts).all
users.each { |user| puts user.posts.count } # Single query for posts
```

### 5.2 Memoization
Cache expensive computation results within a method call.

❌ BAD
```ruby
def expensive_calculation
  # performs complex calculation every time
  @result = some_complex_operation
end
```

✅ GOOD
```ruby
def expensive_calculation
  @result ||= some_complex_operation
end
```

## 6. Security Best Practices

Prioritize security in all code.

### 6.1 Strong Parameters (Rails)
Always use strong parameters to prevent mass assignment vulnerabilities.

❌ BAD
```ruby
def update
  @user.update(params[:user]) # Mass assignment vulnerability
end
```

✅ GOOD
```ruby
def update
  @user.update(user_params)
end

private

def user_params
  params.require(:user).permit(:name, :email, :password)
end
```

### 6.2 SQL Injection Prevention
Use ActiveRecord's query methods or parameter binding. Never interpolate user input directly into SQL.

❌ BAD
```ruby
User.where("name = '#{params[:name]}'") # SQL injection risk
```

✅ GOOD
```ruby
User.where(name: params[:name])
User.where("name = ?", params[:name])
```

## 7. Error Handling

Handle errors gracefully and informatively.

### 7.1 Custom Exceptions
Define custom exceptions for specific error conditions.

❌ BAD
```ruby
raise "User not found"
```

✅ GOOD
```ruby
class UserNotFoundError < StandardError; end

# ...
raise UserNotFoundError, "User with ID #{id} not found"
```

### 7.2 `rescue` Blocks
Use `rescue` for expected error scenarios. Be specific about the exception type.

❌ BAD
```ruby
begin
  # ... risky operation ...
rescue
  puts "An error occurred!" # Catches all exceptions, hides bugs
end
```

✅ GOOD
```ruby
begin
  # ... risky operation ...
rescue ActiveRecord::RecordNotFound => e
  Rails.logger.warn("Record not found: #{e.message}")
  nil # or handle gracefully
rescue StandardError => e
  Rails.logger.error("Unexpected error: #{e.message}")
  raise # Re-raise if unhandled
end
```

## 8. API Design (Rails)

Build RESTful and consistent APIs.

### 8.1 RESTful Routes
Use Rails' `resources` for standard RESTful actions. Use `member` and `collection` for non-standard actions.

❌ BAD
```ruby
get '/users/:id/deactivate', to: 'users#deactivate'
get '/users/active', to: 'users#active'
```

✅ GOOD
```ruby
resources :users do
  member do
    post :deactivate
  end
  collection do
    get :active
  end
end
```

### 8.2 JSON API Standards
Return consistent JSON responses, often following JSON:API specification.

❌ BAD
```json
{ "user": { "id": 1, "name": "Alice" } }
```

✅ GOOD
```json
{
  "data": {
    "id": "1",
    "type": "users",
    "attributes": {
      "name": "Alice"
    }
  }
}
```

## 9. Testing Approaches

RSpec is our preferred testing framework.

### 9.1 RSpec for All Tests
Write unit, integration, and feature tests using RSpec.

❌ BAD
```ruby
# Some tests in Minitest, others in RSpec
```

✅ GOOD
```ruby
# spec/models/user_spec.rb (unit)
# spec/requests/users_spec.rb (integration/feature)
```

### 9.2 Clear Test Descriptions
Use descriptive `describe` and `it` blocks.

❌ BAD
```ruby
describe User do
  it 'works' do
    # ...
  end
end
```

✅ GOOD
```ruby
describe User, '#full_name' do
  it 'returns the first and last name concatenated' do
    user = build(:user, first_name: 'John', last_name: 'Doe')
    expect(user.full_name).to eq('John Doe')
  end
end
```

### 9.3 FactoryBot for Test Data
Use FactoryBot for creating test data, avoiding direct `create` calls in tests.

❌ BAD
```ruby
User.create!(name: 'Test User', email: '[email protected]')
```

✅ GOOD
```ruby
create(:user) # Creates a user with default attributes from factory
build(:user, email: '[email protected]') # Builds without saving
```

© sanjeed5 · CC0-1.0 · sanjeed5/awesome-cursor-rules-mdc

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой