diff --git a/lib/cancan/controller_resource.rb b/lib/cancan/controller_resource.rb index 53cd9101..3b90c0f7 100644 --- a/lib/cancan/controller_resource.rb +++ b/lib/cancan/controller_resource.rb @@ -83,6 +83,10 @@ def load_collection def build_resource resource = resource_base.new(resource_params || {}) + assign_attributes(resource) + end + + def assign_attributes(resource) resource.send("#{parent_name}=", parent_resource) if @options[:singleton] && parent_resource initial_attributes.each do |attr_name, value| resource.send("#{attr_name}=", value) diff --git a/lib/cancan/inherited_resource.rb b/lib/cancan/inherited_resource.rb index 81bca5b8..61bd3331 100644 --- a/lib/cancan/inherited_resource.rb +++ b/lib/cancan/inherited_resource.rb @@ -6,7 +6,8 @@ def load_resource_instance @controller.send :association_chain @controller.instance_variable_get("@#{instance_name}") elsif new_actions.include? @params[:action].to_sym - @controller.send :build_resource + resource = @controller.send :build_resource + assign_attributes(resource) else @controller.send :resource end diff --git a/spec/cancan/inherited_resource_spec.rb b/spec/cancan/inherited_resource_spec.rb index dc4cc58b..3779fe6f 100644 --- a/spec/cancan/inherited_resource_spec.rb +++ b/spec/cancan/inherited_resource_spec.rb @@ -39,4 +39,22 @@ CanCan::InheritedResource.new(@controller).load_resource @controller.instance_variable_get(:@projects).should == :projects end + + it "should build a new resource with attributes from current ability" do + @params[:action] = "new" + @ability.can(:create, Project, :name => "from conditions") + stub(@controller).build_resource { Struct.new(:name).new } + resource = CanCan::InheritedResource.new(@controller) + resource.load_resource + @controller.instance_variable_get(:@project).name.should == "from conditions" + end + + it "should override initial attributes with params" do + @params.merge!(:action => "new", :project => {:name => "from params"}) + @ability.can(:create, Project, :name => "from conditions") + stub(@controller).build_resource { Struct.new(:name).new } + resource = CanCan::ControllerResource.new(@controller) + resource.load_resource + @controller.instance_variable_get(:@project).name.should == "from params" + end end