一种简单、标准化的方法,用于在 Ruby 中构建和使用服务对象(即命令)
A simple, standardized way to build and use Service Objects (aka Commands) in Ruby
Add this line to your application's Gemfile:
gem 'simple_command'And then execute:
$ bundleOr install it yourself as:
$ gem install simple_commandHere'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
endin your locale file
# config/locales/en.yml
en:
activemodel:
errors:
models:
authenticate_user:
failure: Wrong email or passwordThen, in your controller:
…Make the spec file spec/commands/authenticate_user_spec.rb like:
describe AuthenticateUser do
subject(:context) { described_class.call(username, 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
end
end
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
end
endgit checkout -b my-new-feature)git commit -am 'Add some feature')git push origin my-new-feature)暂无开放 Issues,或尚未同步最近议题。