Neo::DCI

Build Status Gem version Code Climate Inline docs

Simple DCI (Data Context Interaction). Includes Data, Roles and Context.

Gem | Source | Documentation

Installation

Add this line to your application's Gemfile:

gem 'neo-dci'

And then execute:

$ bundle

Or install it yourself as:

$ gem install neo-dci

You can generate base classes for your roles and contexts with

$ rake neo-dci:setup

Usage

Data

class User < ActiveRecord::Base
  include Neo::DCI::Data

  attr_accessible
end

Context

class Context < Neo::DCI::Context
end

class RenameUserContext < Context
  # Define callbacks called inside a context.
  callbacks :success, :failure

  def initialize(user_id, new_name)
    @user     = User.find(user_id)
    @new_name = new_name
  end

  def call
    @user.role_as(Renamer)
    if @user.rename_to(@new_name)
      callback.call :success, @new_name
    else
      callback.call :failure, "renaming failed"
    end
  end
end

Interaction (Role)

module Renamer
  extend Neo::DCI::Role

  def rename_to(new_name)
    self.name = new_name
    save
  end
end

Rails Controller

class UsersController < ApplicationController
  def rename
    RenameUserContext.call(current_user.id, params[:name]) do |callback|
      callback.on :success do |new_name|
        redirect_to users_path, :notice => "Renamed successfully to #{new_name}"
      end
      callback.on :failure do |error_message|
        render :alert => "Renaming failed: #{error_message}!"
      end
    end
  end
end

Contributing

  1. Fork it ( https://github.com/neopoly/neo-dci/fork )
  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