Project

approval

0.05
Repository is archived
No release in over 3 years
Low commit activity in last 3 years
There's a lot of open issues
Approval flow for Rails
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

~> 2.0
 Project Readme

Approval

Build Status Gem Version

πŸ™†β€β™€οΈπŸ™…Approval flow for Rails

Installation

  1. Add approval to your Gemfile:
gem 'approval'
  1. Add approval_requests, approval_comments, approval_items tables to your database and an initializer file for configuration:
$ bundle exec rails generate approval:install
  1. Add acts_as_approval_user to your user model (User, AdminUser, Member ...etc)::
class User < ApplicationRecord
  acts_as_approval_user
end
  1. Add acts_as_approval_resource to the models you want use approval flow:
class Book < ApplicationRecord
  acts_as_approval_resource
end

Or if you want to use PORO:

class SomeProcess
  def self.perform
    # something
  end
end

Approval Flow

Make request

You send request, but resources aren't created/updated/destroyed.

πŸ™ Create

staff = User.find_or_create_by(email: "staff@example.com")

record  = Book.new(name: "Ruby Way", price: 2980)
request = staff.request_for_create(record, reason: "something")
request.save # Created Approval::Request record.

records = 10.times.map {|n| Book.new(name: "my_book_#{n}", price: 300) }
request = staff.request_for_create(records, reason: "something")
request.save!

πŸ™ Update

staff = User.find_or_create_by(email: "staff@example.com")

record  = Book.find(1).tap {|record| record.name = "new book title" }
request = staff.request_for_update(record, reason: "something")
request.save

records = Book.where(id: [1, 2, 3]).each {|record| record.price *= 0.5 }
request = staff.request_for_update(records, reason: "something")
request.save!

πŸ™ Destroy

staff = User.find_or_create_by(email: "staff@example.com")

record  = Book.find(1)
request = staff.request_for_destroy(record, reason: "something")
request.save

records = Book.where(id: [1, 2, 3])
request = staff.request_for_destroy(records, reason: "something")
request.save!

πŸ™ Perform

staff = User.find_or_create_by(email: "staff@example.com")

record  = MyProcess.new(recipient: "somebody@example.com")
request = staff.request_for_perform(record, reason: "something")
request.save

Respond

πŸ™†β€β™€οΈ Approve

Then resources are created/updated/destroyed, if respond user have approved the request.

admin = User.find_or_create_by(email: "admin@example.com")

request = Approval::Request.first
respond = admin.approve_request(request, reason: "something")
respond.save! # Create/Update/Destroy resources
πŸ™… Reject

Then resources are not created/updated/destroyed, if respond user have rejected the request.

admin = User.find_or_create_by(email: "admin@example.com")

request = Approval::Request.first
respond = admin.reject_request(request, reason: "something")
respond.save!
πŸ—‘οΈ Cancel
staff = User.find_or_create_by(email: "staff@example.com")

request = Approval::Request.first
respond = staff.cancel_request(request, reason: "something")
respond.save!

Comment

admin = User.find_or_create_by(email: "admin@example.com")

request = Approval::Request.first
admin.approval_comments.create(request: request, content: "Hello")

Configuration

# config/initializers/approval.rb

Approval.configure do |config|
  # User Class Name (e.g: User, AdminUser, Member)
  config.user_class_name = "User"

  # Maximum characters of comment for reason (default: 2000)
  config.comment_maximum = 2000

  # Permit to respond to own request? (default: false)
  config.permit_to_respond_to_own_request = false
end

License

The gem is available as open source under the terms of the MIT License.