Wrap text
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
|