Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

Already on GitHub? Sign in to your account

Fixed bug with params for actions that build new instances with namespaced models #541

Merged
merged 1 commit into from May 10, 2012
Jump to file or symbol
Failed to load files and symbols.
+37 −3
Split
@@ -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)
@@ -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
@@ -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?