Browse files

Fixed bug with params for actions that build new instances with names…

…paced models
  • Loading branch information...
1 parent 9eebeb2 commit baadcb923b2c335cff48c8d683317db0b88496d1 @icrowley icrowley committed Jan 6, 2012
Showing with 37 additions and 3 deletions.
  1. +4 −1 lib/cancan/controller_resource.rb
  2. +18 −2 spec/cancan/controller_resource_spec.rb
  3. +15 −0 spec/spec_helper.rb
View
5 lib/cancan/controller_resource.rb
@@ -82,7 +82,10 @@ def load_collection
end
def build_resource
- resource = resource_base.new(@params[name] || {})
+ params = @options[:class] \
+ ? @params[@options[:class].to_s.underscore.gsub('/', '_')] \
+ : @params[name] || {}
+ resource = resource_base.new(params)
resource.send("#{parent_name}=", parent_resource) if @options[:singleton] && parent_resource
initial_attributes.each do |attr_name, value|
resource.send("#{attr_name}=", value)
View
20 spec/cancan/controller_resource_spec.rb
@@ -62,6 +62,14 @@ class Project < ::Project; end
@controller.instance_variable_get(:@project).name.should == "foobar"
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 with attributes from current ability" do
@params.merge!(:action => "new")
@ability.can(:create, Project, :name => "from conditions")
@@ -324,6 +332,14 @@ class Project < ::Project; end
@controller.instance_variable_get(:@project).should == project
end
+ it "should load the model using a custom namespaced class" do
+ project = Sub::Project.create!
+ @params.merge!(:action => "show", :id => project.id)
+ resource = CanCan::ControllerResource.new(@controller, :class => ::Sub::Project)
+ resource.load_resource
+ @controller.instance_variable_get(:@project).should == project
+ end
+
it "should authorize based on resource name if class is false" do
@params.merge!(:action => "show", :id => 123)
stub(@controller).authorize!(:show, :project) { raise CanCan::AccessDenied }
@@ -339,15 +355,15 @@ class Project < ::Project; end
lambda { resource.load_and_authorize_resource }.should raise_error(CanCan::AccessDenied)
@controller.instance_variable_get(:@custom_project).should == project
end
-
+
it "should load resource using custom ID param" do
project = Project.create!
@params.merge!(:action => "show", :the_project => project.id)
resource = CanCan::ControllerResource.new(@controller, :id_param => :the_project)
resource.load_resource
@controller.instance_variable_get(:@project).should == project
end
-
+
it "should load resource using custom find_by attribute" do
project = Project.create!(:name => "foo")
@params.merge!(:action => "show", :id => "foo")
View
15 spec/spec_helper.rb
@@ -31,6 +31,21 @@ class Category < SuperModel::Base
has_many :projects
end
+module Sub
+ class Project < SuperModel::Base
+ belongs_to :category
+ attr_accessor :category # why doesn't SuperModel do this automatically?
+
+ def self.respond_to?(method, include_private = false)
+ if method.to_s == "find_by_name!" # hack to simulate ActiveRecord
+ true
+ else
+ super
+ end
+ end
+ end
+end
+
class Project < SuperModel::Base
belongs_to :category
attr_accessor :category # why doesn't SuperModel do this automatically?

0 comments on commit baadcb9

Please sign in to comment.