Skip to content

Helpers ​

Helpers are methods available inside generator steps for manipulating files, rendering templates, running commands, and modifying Ruby source code.

All helpers are automatically included in every generator. They integrate with the tracer for output logging and respect --dry-run and --reverse flags.

File Operations ​

create_file ​

Creates a file with the given content. Accepts a block as an alternative to the content argument.

ruby
create_file "app/models/user.rb", <<~RUBY
  class User
  end
RUBY
ruby
create_file "config/settings.yml" do
  "timeout: 30\nretries: 3\n"
end

In reverse mode, create_file removes the file instead.


remove_file ​

Deletes a file. Skipped in reverse mode (already destructive).

ruby
remove_file "tmp/old_config.yml"

copy_file ​

Copies a file from source to destination. In reverse mode, removes the destination file.

ruby
copy_file "templates/config.yml", "config/settings.yml"

create_directory ​

Creates a directory. In reverse mode, removes the directory. alias: mkdir.

ruby
create_directory "app/services"

append_to_file ​

Appends content to the end of a file. Accepts a block. Skipped in reverse mode. (TODO: could we not skipt it?)

ruby
append_to_file "Gemfile", "\ngem 'sidekiq'\n"

prepend_to_file ​

Prepends content to the beginning of a file. Accepts a block. Skipped in reverse mode. (TODO: could we not skipt it?)

ruby
prepend_to_file "app/models/user.rb", <<~RUBY
  # frozen_string_literal: true"
RUBY

inject_into_file ​

Injects content into a file at a specific location using before: or after: anchors. Skipped in reverse mode. alias: inject

ruby
str = "\n  resources :posts\n"

inject "config/routes.rb", str, after: "Rails.application.routes.draw do\n"
ruby
inject "Gemfile", "gem 'pg'\n", before: "gem 'sqlite3'"

gsub_file ​

Performs a global substitution in a file. Skipped in reverse mode.

ruby
gsub_file "config/database.yml", "sqlite3", "postgresql"

chmod ​

Changes file permissions. Skipped in reverse mode.

ruby
chmod "bin/setup", 0o755

Templates ​

template ​

Renders an ERB template from the generator's templates/ directory and writes the result to the destination path. In reverse mode, removes the generated file.

ruby
template "controller.rb.tt"

Template files use the .tt extension. The destination path is derived by stripping .tt from the source name, or can be specified explicitly.

ruby
template "controller.rb.tt", "app/controllers/#{params.name}_controller.rb"

Inside templates, all generator methods and params are available.

erb
class <%= params.name.to_class %>Controller < ApplicationController
  def index
    @<%= params.name.pluralize %> = <%= params.name.to_class %>.all
  end
end

Custom Template Context ​

Pass a context: option to expose a different object's methods inside the template.

ruby
template "model.rb.tt", context: ParamsDecorator.new(params)

The context object's methods take priority. If a method is not found on the context, Loci falls back to the generator instance.

Ruby Code Helpers ​

inject_into_class ​

Injects content into a class or module body. Content is placed before the first method definition. Skipped in reverse mode.

ruby
inject_into_class "app/models/user.rb", "ClassName", "  has_many :posts\n"

Accepts a block:

ruby
inject_into_class "app/models/user.rb", "ClassName" do
  "  validates :name, presence: true\n"
end

inject_into_private ​

Injects content into the private section of a class. Creates the private keyword if it does not exist. Skipped in reverse mode.

ruby
inject_into_private "app/models/user.rb", "ClassName", <<~RUBY
  def normalize_name
    self.name = name.strip
  end
RUBY

gem ​

Adds a gem to the Gemfile. Supports version constraints, source options, and group scoping. Bidirectional: adds in forward mode, runs bundle remove in reverse.

ruby
gem "sidekiq"
ruby
gem "pg", "~> 1.5"
ruby
gem "rspec", group: :test
ruby
gem "my_gem", github: "user/repo", branch: "main"

Rails Helpers ​

rails_generate ​

Runs a Rails generator. In reverse mode, runs the corresponding rails destroy command. Aliased as rails_g.

ruby
rails_generate "migration", "CreateUsers", "name:string", "email:string"

add_route ​

Adds a route to config/routes.rb. Supports type: of :resources, :resource, or :namespace. Handles nested namespaces automatically. Skipped in reverse mode.

ruby
add_route "posts"
ruby
add_route "api/v1/users", type: :resources

This generates the proper namespace wrapping:

ruby
namespace :api do
  namespace :v1 do
    resources :users
  end
end

System Helpers ​

system_command ​

Executes a shell command. Aliased as cmd. Skipped in reverse mode.

ruby
cmd "bundle", "install"

cd ​

Changes the working directory for the duration of a block.

ruby
cd "frontend" do
  cmd "npm", "install"
end

Text Helpers ​

wrap_with ​

Wraps captured content in a block structure. Useful for building class or module bodies.

ruby
content = wrap_with("class User < ApplicationRecord") do
  "has_many :posts"
end

# class User < ApplicationRecord
#   has_many :posts
# end

wrap_with_modules ​

Wraps content in nested module declarations.

ruby
wrap_with_modules("api", "v1") do
  <<~RUBY
    class UsersController
    end
  RUBY
end

# module Api
#   module V1
#     class UsersController
#     end
#   end
# end