refactoring out resource loading/building logic into separate class
This commit is contained in:
parent
cd217eb9cf
commit
51fa61bbae
|
@ -5,5 +5,6 @@ module CanCan
|
||||||
end
|
end
|
||||||
|
|
||||||
require File.dirname(__FILE__) + '/cancan/ability'
|
require File.dirname(__FILE__) + '/cancan/ability'
|
||||||
|
require File.dirname(__FILE__) + '/cancan/controller_resource'
|
||||||
require File.dirname(__FILE__) + '/cancan/resource_authorization'
|
require File.dirname(__FILE__) + '/cancan/resource_authorization'
|
||||||
require File.dirname(__FILE__) + '/cancan/controller_additions'
|
require File.dirname(__FILE__) + '/cancan/controller_additions'
|
||||||
|
|
39
lib/cancan/controller_resource.rb
Normal file
39
lib/cancan/controller_resource.rb
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
module CanCan
|
||||||
|
class ControllerResource # :nodoc:
|
||||||
|
def initialize(controller, name, parent = nil)
|
||||||
|
@controller = controller
|
||||||
|
@name = name
|
||||||
|
@parent = parent
|
||||||
|
end
|
||||||
|
|
||||||
|
def model_class
|
||||||
|
@name.to_s.camelize.constantize
|
||||||
|
end
|
||||||
|
|
||||||
|
def find(id)
|
||||||
|
self.model_instance = base.find(id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def build(attributes)
|
||||||
|
if base.kind_of? Class
|
||||||
|
self.model_instance = base.new(attributes)
|
||||||
|
else
|
||||||
|
self.model_instance = base.build(attributes)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def model_instance
|
||||||
|
@controller.instance_variable_get("@#{@name}")
|
||||||
|
end
|
||||||
|
|
||||||
|
def model_instance=(instance)
|
||||||
|
@controller.instance_variable_set("@#{@name}", instance)
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def base
|
||||||
|
@parent ? @parent.model_instance.send(@name.to_s.pluralize) : model_class
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -14,66 +14,37 @@ module CanCan
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_resource
|
def load_resource
|
||||||
load_parent if @options[:nested]
|
|
||||||
unless collection_actions.include? params[:action].to_sym
|
unless collection_actions.include? params[:action].to_sym
|
||||||
if new_actions.include? params[:action].to_sym
|
if new_actions.include? params[:action].to_sym
|
||||||
if parent_instance
|
resource.build(params[model_name.to_sym])
|
||||||
self.model_instance = parent_instance.send(model_name.pluralize).build(params[model_name.to_sym])
|
|
||||||
else
|
|
||||||
self.model_instance = model_class.new(params[model_name.to_sym])
|
|
||||||
end
|
|
||||||
elsif params[:id]
|
elsif params[:id]
|
||||||
if parent_instance
|
resource.find(params[:id])
|
||||||
self.model_instance = parent_instance.send(model_name.pluralize).find(params[:id])
|
|
||||||
else
|
|
||||||
self.model_instance = model_class.find(params[:id])
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def authorize_resource
|
def authorize_resource
|
||||||
@controller.unauthorized! if @controller.cannot?(params[:action].to_sym, model_instance || model_class)
|
@controller.unauthorized! if @controller.cannot?(params[:action].to_sym, resource.model_instance || resource.model_class)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def resource
|
||||||
|
@resource ||= ControllerResource.new(@controller, model_name, parent_resource)
|
||||||
|
end
|
||||||
|
|
||||||
|
def parent_resource
|
||||||
|
if @options[:nested]
|
||||||
|
parent = ControllerResource.new(@controller, @options[:nested])
|
||||||
|
parent.find(@params["#{@options[:nested]}_id".to_sym])
|
||||||
|
parent
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def model_name
|
def model_name
|
||||||
params[:controller].split('/').last.singularize
|
params[:controller].split('/').last.singularize
|
||||||
end
|
end
|
||||||
|
|
||||||
def model_class
|
|
||||||
model_name.camelcase.constantize
|
|
||||||
end
|
|
||||||
|
|
||||||
def load_parent
|
|
||||||
self.parent_instance = parent_class.find(parent_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def parent_class
|
|
||||||
@options[:nested].to_s.camelcase.constantize
|
|
||||||
end
|
|
||||||
|
|
||||||
def parent_id
|
|
||||||
@params["#{@options[:nested]}_id".to_sym]
|
|
||||||
end
|
|
||||||
|
|
||||||
def model_instance
|
|
||||||
@controller.instance_variable_get("@#{model_name}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def model_instance=(instance)
|
|
||||||
@controller.instance_variable_set("@#{model_name}", instance)
|
|
||||||
end
|
|
||||||
|
|
||||||
def parent_instance
|
|
||||||
@controller.instance_variable_get("@#{@options[:nested]}")
|
|
||||||
end
|
|
||||||
|
|
||||||
def parent_instance=(instance)
|
|
||||||
@controller.instance_variable_set("@#{@options[:nested]}", instance)
|
|
||||||
end
|
|
||||||
|
|
||||||
def collection_actions
|
def collection_actions
|
||||||
[:index] + [@options[:collection]].flatten
|
[:index] + [@options[:collection]].flatten
|
||||||
end
|
end
|
||||||
|
|
37
spec/cancan/controller_resource_spec.rb
Normal file
37
spec/cancan/controller_resource_spec.rb
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
require File.dirname(__FILE__) + '/../spec_helper'
|
||||||
|
|
||||||
|
describe CanCan::ControllerResource do
|
||||||
|
before(:each) do
|
||||||
|
@controller = Object.new
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should determine model class by constantizing give name" do
|
||||||
|
CanCan::ControllerResource.new(@controller, :ability).model_class.should == Ability
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should fetch model through model class and assign it to the instance" do
|
||||||
|
stub(Ability).find(123) { :some_ability }
|
||||||
|
CanCan::ControllerResource.new(@controller, :ability).find(123)
|
||||||
|
@controller.instance_variable_get(:@ability).should == :some_ability
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should fetch model through parent and assign it to the instance" do
|
||||||
|
parent = Object.new
|
||||||
|
stub(parent).model_instance.stub!.abilities.stub!.find(123) { :some_ability }
|
||||||
|
CanCan::ControllerResource.new(@controller, :ability, parent).find(123)
|
||||||
|
@controller.instance_variable_get(:@ability).should == :some_ability
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should build model through model class and assign it to the instance" do
|
||||||
|
stub(Ability).new(123) { :some_ability }
|
||||||
|
CanCan::ControllerResource.new(@controller, :ability).build(123)
|
||||||
|
@controller.instance_variable_get(:@ability).should == :some_ability
|
||||||
|
end
|
||||||
|
|
||||||
|
it "should build model through parent and assign it to the instance" do
|
||||||
|
parent = Object.new
|
||||||
|
stub(parent).model_instance.stub!.abilities.stub!.build(123) { :some_ability }
|
||||||
|
CanCan::ControllerResource.new(@controller, :ability, parent).build(123)
|
||||||
|
@controller.instance_variable_get(:@ability).should == :some_ability
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in New Issue
Block a user