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
# optional, initialize the command with some arguments
def initialize(user, password)
@user = user
@password = password
end
# mandatory: define a #call method. its return value will be available
# through #result
def call
if user = User.authenticate(@email, @password)
return user
else
errors.add(authentication, I18n.t "authenticate_user.failure")
end
nil
end
end
Then, in your controller:
class SessionsController < ApplicationController
def create
# initialize and execute the command
# NOTE: `.call` is a shortcut for `.new(args).call)`
command = AuthenticateUser.call(session_params[:user], 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
flash.now[:alert] = t(command.errors[:authentication])
render :new
end
end
private
def session_params
params.require(:session).permit(:email, :password)
end
end
- Fork it ( https://github.com/nebulab/simple_command/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request