Report abuse

the module


			
module RestfulActions
  module ActionController
    module BaseMethods
      def self.included(base)
        base.extend ClassMethods
      end

      module ClassMethods
        def restful_actions_for(resource_name, options = {})
          resource  = Resource.new(resource_name, options)
          generator = Generator.new(resource)
          yield generator if block_given?
          decl = [:index, :new, :show, :create].inject([]) { |d, action| d << generator.action!(action) }
          decl << generator.define!(:find_member, :find_member_filter, true)
          class_eval decl.join("\n"), __FILE__, __LINE__
          before_filter resource.member_filter_name, :except => [:index, :new, :create]
        end
      end
    end
  end
end

the generated code


			
module RestfulActions
  module ActionController
    class Generator
      def initialize(resource)
        @resource = resource
      end

      def index_action
        "@#{@resource.collection} = #{@resource.class_name}.find(:all)"
      end

      def show_action
        ''
      end

      def new_action
        "@#{@resource.member} = #{@resource.class_name}.new"
      end

      def create_action
        <<-end_src
        @#{@resource.member} = #{@resource.class_name}.new(params[:#{@resource.member}])
        @#{@resource.member}.save!
        redirect_to #{@resource.member}_path(@#{resource.member})
        end_src
      end

      def action!(action, protected = false)
        define! action, "#{action}_action", protected
      end

      def define!(method_name, callback, protected = false)
        "def #{method_name}\n#{send(callback)}\nend\n#{protected ? 'protected' : 'public'} :#{method_name}"
      end
    end
  end
end

the test


			
class PostsControllerTest < Test::Unit::TestCase
  def setup
    @controller = PostsController.new
    @request    = ActionController::TestRequest.new
    @response   = ActionController::TestResponse.new
  end

  def test_should_create_index_action
    get :index
    assert_response :success
    assert_not_nil assigns(:posts)
  end
end