diff --git a/lib/cancan/controller_resource.rb b/lib/cancan/controller_resource.rb index 3b90c0f..8ca8a16 100644 --- a/lib/cancan/controller_resource.rb +++ b/lib/cancan/controller_resource.rb @@ -213,10 +213,15 @@ module CanCan def resource_params if @options[:class] - @params[@options[:class].to_s.underscore.gsub('/', '_')] - else - @params[namespaced_name.to_s.underscore.gsub("/", "_")] + params_key = extract_key(@options[:class]) + return @params[params_key] if @params[params_key] end + + resource_params_by_namespaced_name + end + + def resource_params_by_namespaced_name + @params[extract_key(namespaced_name)] end def namespace @@ -244,5 +249,11 @@ module CanCan def new_actions [:new, :create] + [@options[:new]].flatten end + + private + + def extract_key(value) + value.to_s.underscore.gsub('/', '_') + end end end diff --git a/spec/cancan/controller_resource_spec.rb b/spec/cancan/controller_resource_spec.rb index 34f3868..2fa05d9 100644 --- a/spec/cancan/controller_resource_spec.rb +++ b/spec/cancan/controller_resource_spec.rb @@ -75,13 +75,19 @@ describe CanCan::ControllerResource do end it "should build a new resource for namespaced model with hash if params[:id] is not specified" do - project = Sub::Project.create! @params.merge!(:action => "create", 'sub_project' => {:name => "foobar"}) resource = CanCan::ControllerResource.new(@controller, :class => ::Sub::Project) resource.load_resource @controller.instance_variable_get(:@project).name.should == "foobar" end + it "should build a new resource for namespaced controller and namespaced model with hash if params[:id] is not specified" do + @params.merge!(:controller => "Admin::SubProjectsController", :action => "create", 'sub_project' => {:name => "foobar"}) + resource = CanCan::ControllerResource.new(@controller, :class => Project) + resource.load_resource + @controller.instance_variable_get(:@sub_project).name.should == "foobar" + end + it "should build a new resource with attributes from current ability" do @params.merge!(:action => "new") @ability.can(:create, Project, :name => "from conditions")