Ruby and Rails Rules Engine Framework

More detailed documentation at www.r3ef.com

Installation Guide

1. Install the Gem


sudo gem install rules_engine
sudo gem install rspec cucumber

2. Create the Rails App


rails MyCoolNewApp	
cd MyCoolNewApp
rm ./public/index.html

./script/generate rspec
./script/generate cucumber --rspec

./script/generate rules_engine

rake db:migrate	

3. Setup the Rails Environments

./config/environment.rb


Rails::Initializer.run do |config|
  ...
  config.gem 'rules_engine'
  config.gem 'will_paginate'
  config.gem 'acts_as_list'
  ...
  config.active_record.observers = :re_workflow_activated_observer
  ...
end

RulesEngine::Discovery.discover!

./config/environments/production.rb
./config/environments/development.rb


RulesEngine::Cache.cache_store = :mem_cache_store, "localhost:11210"
  #   RulesEngine::Cache.cache_store = :memory_store
  #   RulesEngine::Cache.cache_store = :file_store, "/path/to/cache/directory"
  #   RulesEngine::Cache.cache_store = :drb_store, "druby://localhost:9192"
  #   RulesEngine::Cache.cache_store = :mem_cache_store, "localhost"
  #   RulesEngine::Cache.cache_store = MyOwnStore.new("parameter")

./config/environments/test.rb
./config/environments/cucumber.rb


  config.gem "rspec",             :version => '>=1.3.0', :lib => false
  config.gem "rspec-rails",       :version => '>=1.3.2', :lib => false
  config.gem "faker",             :version => '>=0.3.1', :lib => false

  config.gem "machinist",         :version => '>=1.0.6', :lib => false
  config.gem 'rcov',              :version => '>=0.9.8', :lib => false
  config.gem 'remarkable_rails',  :version => '>=3.1.13', :lib => false

  require 'machinist/active_record'
  require 'sham'
  require 'faker'
  require 'remarkable_rails'

4. Install the Required Gems


rake gems:install
rake gems:install RAILS_ENV=test  	

5. Add the Routes

./config/routes.rb


ActionController::Routing::Routes.draw do |map|
  ...
  ### remove map.root if already defined
  map.root :controller => 're_workflows', :action => 'template'
  ### map.preview '/preview', :controller => 're_workflows', :action => 'template'
  map.resources :re_workflows, 
                        :collection => {:lookup => :get, 
                                        :activate_all => :put}, 
                        :member => {:change => :get, 
                                        :activate => :put, 
                                        :deactivate => :put, 
                                        :revert => :put} do |re_workflow|  
  re_workflow.resources :re_rules, 
                            :controller => :re_workflow_rules, 
                            :collection => {:help => :get, :error => :get}, 
                            :member => {:move_up => :put, :move_down => :put}
    re_workflow.resources :re_processs, 
                            :controller => :re_workflow_processs, 
                            :only => [:index]
  end

  map.resources :re_processs, :only => [:index, :show]
  ...
end  

6. Define the Access Levels

./app/controllers/application_controller.rb


class ApplicationController < ActionController::Base

  helper_method :rules_engine_reader?, :rules_engine_editor?
  
  def rules_engine_reader?
    # why cookies[:rules_engine_reader] ? It's a workaround for cucumber testing
    return cookies[:rules_engine_reader].nil? ? true : 
                                                cookies[:rules_engine_reader].downcase == 'true'
  end  
  
  def rules_engine_editor?
    # why cookies[:rules_engine_editor] ? It's a workaround for cucumber testing
    return cookies[:rules_engine_editor].nil? ? true : 
                                                cookies[:rules_engine_editor].downcase == 'true'
  end  

  def rules_engine_reader_access_required
    unless rules_engine_reader?    
      redirect_to(root_path) 
      flash[:success] = 'Rules Engine Access Denied.'
    end  
  end
  
  def rules_engine_editor_access_required
    unless rules_engine_editor?    
      redirect_to(root_path) 
      flash[:success] = 'Rules Engine Editor Access Denied.'
    end
  end

7. Create a Simple Rule


./script/generate rules_engine simple my_simple_rule

8. Create a more Complex Rule


./script/generate rules_engine complex another_complex_rule

9. Run the Tests


rake spec
rake spec:rcov
rake cucumber
open coverage/index.html

10. Start the Server


./script/server
open http://localhost:3000/re_workflows

11. Create Workflows and Rules

Watch the demo at TODO