askill
vanilla-rails-style

vanilla-rails-styleSafety 95Repository

Use when writing Ruby/Rails code - enforces expanded conditionals over guard clauses, private indentation, invocation-order methods, and bang method restrictions that contradict standard Ruby guides

3 stars
1.2k downloads
Updated 2/14/2026

Package Files

Loading files...
SKILL.md

Vanilla Rails Style

These conventions CONTRADICT standard Ruby style guides. They reflect production 37signals code.

Counter-Intuitive Patterns

Pattern37signals WayStandard Ruby Way
Conditionalsif/elseGuard clauses
Private indent2 spaces under privateNo indentation
Bang methodsOnly with counterpartFlag "dangerous" actions
Method orderInvocation sequenceAlphabetical

Expanded Conditionals (NOT Guard Clauses)

Prefer if/else. Guard clauses allowed ONLY at method start with 5+ line body.

# Good
def todos_for_new_group
  if ids = params.require(:todolist)[:todo_ids]
    @bucket.recordings.todos.find(ids.split(","))
  else
    []
  end
end

# Bad
def todos_for_new_group
  ids = params.require(:todolist)[:todo_ids]
  return [] unless ids
  @bucket.recordings.todos.find(ids.split(","))
end

Multiple guards → nested if/else. Convert return unless chains to nested conditionals that show complete logic flow.

Allowed exception:

def after_recorded_as_commit(recording)
  return if recording.parent.was_created?  # Guard at START, complex body below

  if recording.was_created?
    broadcast_new_column(recording)
  else
    broadcast_column_change(recording)
  end
end

Private Method Indentation

Indent 2 spaces under private. No newline after private.

class SomeClass
  def public_method
    # ...
  end

  private
    def helper_one
      # indented
    end

    def helper_two
      # indented
    end
end

Exception — module with ONLY private methods: mark private at top, blank line, no indent.

Method Ordering

Order by invocation sequence — callers before callees:

  1. Class methods
  2. initialize (first among instance methods)
  3. Public methods
  4. Private methods (ordered by call sequence)
class Builder
  def build
    prepare
    format
    output
  end

  private
    def prepare; end   # called first
    def format; end    # called second
    def output; end    # called third
end

Bang Methods

Only use ! when non-bang counterpart exists: save/save!, update/update!.

No counterpart → no bang. close not close!. archive not archive!.

Red Flags

If you're about to...Do this instead
Add guard clausesUse if/else
Remove private indentationIndent under private
Add ! to method without counterpartUse plain name
Alphabetize private methodsOrder by invocation
Create a service objectMove logic to model

Self-Check

  • if/else instead of guard clauses (except single guard at start with complex body)
  • Private methods indented under private
  • Methods ordered by invocation sequence
  • Bang only on methods with non-bang counterpart

Install

Download ZIP
Requires askill CLI v1.0+

AI Quality Score

72/100Analyzed 2/23/2026

A well-structured style guide documenting unconventional Ruby/Rails conventions (expanded conditionals, private indentation, invocation-order methods, bang restrictions). Has clear examples and self-check list. Scores well on clarity and organization but penalized for internal-only signals (project-specific path, company-specific conventions) and mismatched tag. Could be more actionable with CI/linter integration details.

95
90
60
75
75

Metadata

Licenseunknown
Version-
Updated2/14/2026
PublisherZempTime

Tags

ci-cd