0.0
No commit activity in last 3 years
No release in over 3 years
design pattern that allows order-independent class-level definition of action-dependent controller methods for rails - action types default to rails CRUD actions
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

Runtime

 Project Readme

CrudeMethods

This is a rails support library that provides a way to define action-dependent controller methods in an order-independent declarative way. The action types default to rails CRUD actions and can be extended or modified on each controller.

This gem is supposed to be used by restful/resourceful controller abstractions as a simple and flexible interface for the user to set potentially action-specific behavour.

Here I give some end-user cases. Note that this gem does not provide the particular controller abstraction functionalities in the examples, just demonstrate a common use of this specification pattern.

  1. a resourceful controller scaffold but adding a search action. The user just hooks into the resource retrieval scope chain, otherwise all behave as a crud index-type action:
class ModelsController
  include ResourfulCrudActions
  crud_actions :defaults, :index! => [:search]
  resources :search do |scope|
    scope.search(params[:search])
  end
end
  1. Imagine a responder abstraction, then the user can modify action-specific behaviour.
class ModelsController
  include SmartResponder
  crud_actions :defaults
  response_on_success :create do |format|
    format.html { redirect_to home_path } 
  end
end

How these would use crud_methods is described in 'Usage' section.

Features

A crud method allows

  • class-level declaration of action specific behaviour
  • the method definition block is executed in controller instance scope when the method is called on the instantiated controller.
  • actions are hierarchically organized allowing default behaviour for an action type (with bang, like :index!)
  • user added custom actions will fall back to crud type they belong to
  • specification on different action-types are order-independent say action is :show, if current controller specifies a fallback with :all, but a specification for :show! is inherited, then the latter wins.
  • for a more thorough understanding, see the documentation of the state_methods gem.

Usage

This section describes how the developer of any controller abstraction gem will use crud_methods.

require 'crud_methods'           # require crud_method
module MyGem::Controller
  def self.included(base)
    base.class_eval do
      include CrudMethods         # include crud_method support
      crud_method :resource       # declare action-specific method
      # define your action-specific behaviour here on the class level
      resource :create!, :new! do        
        resource_class.new(params[model_name], :as => current_role)
      end 
      #...
    end
  end

Then the user will do:

class SignupsController
  include MyGem::Controller
  crud_actions :defaults, :new! => [:wait]
  # instead of signup just put on waiting list
  resource :wait do
    resource_class.new(params[model_name], :as => current_role).
      tap { status = :waiting }
  end
end

Implementation

This gem is basically a paticular use case of the state_methods gem on controller classes where the 'state accessor method' is action_name and the default state partition is the usual CRUD actions of rails.

Gotchas

  • do not use super within the class-level method definition block. it won't refer to anything reliable. use fallback calls. :TODO: add more info.
  • specifying a method for a type (of action), will not override other specs for a subtype (or particular action) either earlier or later. This may be counterintuitive to some especially that specifications for action types can be 'hidden' coming via controller inheritance or included modules. :TODO: add more info.
  • see the documentation of the state_methods gem

Installation

Add this line to your application's Gemfile:

gem 'crud_methods'

And then execute:

$ bundle

Or install it yourself as:

$ gem install crud_methods

Contributing

  1. Fork it
  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 new Pull Request