Need help with simple_command?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

526 Stars 48 Forks MIT License 50 Commits 6 Opened issues


A simple, standardized way to build and use Service Objects (aka Commands) in Ruby

Services available


Need anything else?

Contributors list

Code Climate Codeship Status for nebulab/simple_command


A simple, standardized way to build and use Service Objects (aka Commands) in Ruby


  • Ruby 2.0+


Add this line to your application's Gemfile:

gem 'simple_command'

And then execute:

$ bundle

Or install it yourself as:

$ gem install simple_command


Here's a basic example of a command that authenticates a user

# define a command class
class AuthenticateUser
  # put SimpleCommand before the class' ancestors chain
  prepend SimpleCommand
  include ActiveModel::Validations

optional, initialize the command with some arguments

def initialize(email, password) @email = email @password = password end

mandatory: define a #call method. its return value will be available

through #result

def call if user = User.find_by(email: @email)&.authenticate(@password) return user else errors.add(:base, :failure) end nil end end

in your locale file ```yaml


en: activemodel: errors: models: authenticate_user: failure: Wrong email or password ```

Then, in your controller:

class SessionsController < ApplicationController
  def create
    # initialize and execute the command
    # NOTE: `.call` is a shortcut for `.new(args).call`
    command =[:email], session_params[:password])

# check command outcome
if command.success?
  # command#result will contain the user instance, if found
  session[:user_token] = command.result.secret_token
  redirect_to root_path
else[:alert] = t(command.errors.full_messages.to_sentence)
  render :new



def session_params params.require(:session).permit(:email, :password) end end

Test with Rspec

Make the spec file

describe AuthenticateUser do
  subject(:context) {, password) }

describe '.call' do context 'when the context is successful' do let(:username) { 'correct_user' } let(:password) { 'correct_password' }

  it 'succeeds' do
    expect(context).to be_success

context 'when the context is not successful' do
  let(:username) { 'wrong_user' }
  let(:password) { 'wrong_password' }

  it 'fails' do
    expect(context).to be_failure

end end


  1. Fork it ( )
  2. Create your feature branch (
    git checkout -b my-new-feature
  3. Commit your changes (
    git commit -am 'Add some feature'
  4. Push to the branch (
    git push origin my-new-feature
  5. Create a new Pull Request

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.