Hello guys, I have the following spec: describe ''With successful save'' do it ''Should redirect to the new page'' do do_post response.should be_redirect response.should redirect_to( :action => ''show'', :id => @static_page.permalink ) ## this is the line 118 end end And when I try to run it it gives me the following error: 1) ActionController::MethodNotAllowed in ''StaticPagesController Handling POST /pages With successful save Should redirect to the new page'' Only get, put, and delete requests are allowed. ./spec/controllers/static_pages_controller_spec.rb:118: script/spec:4: So, the response is a redirect (the "response.should be_redirect" passes) but when i try to be sure that it redirected to the right page it throws this weird error to me. Any ideas about what I''ve done wrong? I''m using RSpec 1.1.3 and Rails 2.0.2. -- Maur?cio Linhares http://alinhavado.wordpress.com/ (pt-br) | http://codeshooter.wordpress.com/ (en) Jo?o Pessoa, PB, +55 83 8867-7208
On Fri, Feb 22, 2008 at 7:50 AM, Maur?cio Linhares <mauricio.linhares at gmail.com> wrote:> Hello guys, > > I have the following spec: > > describe ''With successful save'' do > > it ''Should redirect to the new page'' do > do_post > response.should be_redirect > response.should redirect_to( :action => ''show'', :id => > @static_page.permalink ) ## this is the line 118 > end > > end > > And when I try to run it it gives me the following error: > > 1) > ActionController::MethodNotAllowed in ''StaticPagesController Handling > POST /pages With successful save Should redirect to the new page'' > Only get, put, and delete requests are allowed. > ./spec/controllers/static_pages_controller_spec.rb:118: > script/spec:4: > > So, the response is a redirect (the "response.should be_redirect" > passes) but when i try to be sure that it redirected to the right page > it throws this weird error to me. Any ideas about what I''ve done > wrong?Can you post the full backtrace? script/spec ./spec/controllers/static_pages_controller_spec.rb -b> > I''m using RSpec 1.1.3 and Rails 2.0.2. > > -- > Maur?cio Linhares > http://alinhavado.wordpress.com/ (pt-br) | > http://codeshooter.wordpress.com/ (en) > Jo?o Pessoa, PB, +55 83 8867-7208 > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
Using the "path" method the spec passes, but i don''t use the path method on my controller. First, here''s my controller code: def create @static_page = @event.static_pages.build(params[:static_page]) respond_to do |format| if @static_page.save flash[:notice] = ''Page was successfully created.'' format.html { redirect_to(:action => ''show'', :id => @static_page.permalink ) } ## thats what i''m testing agains format.xml { render :xml => @static_page, :status => :created, :location => @static_page } else format.html { render :action => "new" } format.xml { render :xml => @static_page.errors, :status => :unprocessable_entity } end end end And here is the spec: it ''Should redirect to the new page'' do do_post response.should be_redirect response.should redirect_to( page_path( :action => ''show'', :id => @static_page.permalink ) ) ## this one, with the page_path goes fine response.should redirect_to( :action => ''show'', :id => @static_page.permalink ) ## this one, without the page_path doesn''t work end It seems that the redirect_to matcher doesn''t recognize the current controller. And here goes the full backtrace: ActionController::MethodNotAllowed in ''StaticPagesController Handling POST /pages With successful save Should redirect to the new page'' Only get, put, and delete requests are allowed. /usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/routing.rb:1439:in `recognize_path'' /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:43:in `path_hash'' /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:38:in `hash_from_url'' /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:26:in `actual_hash'' /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:34:in `actual_redirect_to_valid_route'' /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:18:in `matches?'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/expectations/handler.rb:19:in `handle_matcher'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb:34:in `should'' ./spec/controllers/static_pages_controller_spec.rb:119: /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:78:in `instance_eval'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:78:in `run_with_description_capturing'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:19:in `execute'' /usr/lib/ruby/1.8/timeout.rb:48:in `timeout'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:16:in `execute'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:292:in `execute_examples'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:291:in `each'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:291:in `execute_examples'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:121:in `run'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:22:in `run'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in `each'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in `run'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/options.rb:90:in `run_examples'' /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/command_line.rb:19:in `run'' script/spec:4: On Fri, Feb 22, 2008 at 11:00 AM, David Chelimsky <dchelimsky at gmail.com> wrote:> On Fri, Feb 22, 2008 at 7:50 AM, Maur?cio Linhares > <mauricio.linhares at gmail.com> wrote: > > Hello guys, > > > > I have the following spec: > > > > describe ''With successful save'' do > > > > it ''Should redirect to the new page'' do > > do_post > > response.should be_redirect > > response.should redirect_to( :action => ''show'', :id => > > @static_page.permalink ) ## this is the line 118 > > end > > > > end > > > > And when I try to run it it gives me the following error: > > > > 1) > > ActionController::MethodNotAllowed in ''StaticPagesController Handling > > POST /pages With successful save Should redirect to the new page'' > > Only get, put, and delete requests are allowed. > > ./spec/controllers/static_pages_controller_spec.rb:118: > > script/spec:4: > > > > So, the response is a redirect (the "response.should be_redirect" > > passes) but when i try to be sure that it redirected to the right page > > it throws this weird error to me. Any ideas about what I''ve done > > wrong? > > Can you post the full backtrace? > > script/spec ./spec/controllers/static_pages_controller_spec.rb -b > > > > > > I''m using RSpec 1.1.3 and Rails 2.0.2. > > > > -- > > Maur?cio Linhares > > http://alinhavado.wordpress.com/ (pt-br) | > > http://codeshooter.wordpress.com/ (en) > > Jo?o Pessoa, PB, +55 83 8867-7208 > > _______________________________________________ > > rspec-users mailing list > > rspec-users at rubyforge.org > > http://rubyforge.org/mailman/listinfo/rspec-users > > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >-- Maur?cio Linhares http://alinhavado.wordpress.com/ (pt-br) | http://codeshooter.wordpress.com/ (en) Jo?o Pessoa, PB, +55 83 8867-7208
On Fri, Feb 22, 2008 at 8:10 AM, Maur?cio Linhares <mauricio.linhares at gmail.com> wrote:> Using the "path" method the spec passes, but i don''t use the path > method on my controller. First, here''s my controller code: > > def create > @static_page = @event.static_pages.build(params[:static_page]) > > respond_to do |format| > if @static_page.save > flash[:notice] = ''Page was successfully created.'' > format.html { redirect_to(:action => ''show'', :id => > @static_page.permalink ) } ## thats what i''m testing agains > format.xml { render :xml => @static_page, :status => > :created, :location => @static_page } > else > format.html { render :action => "new" } > format.xml { render :xml => @static_page.errors, :status => > :unprocessable_entity } > end > end > end > > And here is the spec: > > > it ''Should redirect to the new page'' do > do_post > response.should be_redirect > response.should redirect_to( page_path( :action => ''show'', :id > => @static_page.permalink ) ) ## this one, with the page_path goes > fine > > response.should redirect_to( :action => ''show'', :id => > @static_page.permalink ) ## this one, without the page_path doesn''t > work > end > > It seems that the redirect_to matcher doesn''t recognize the current controller.Ah. I missed that the initial example was missing the controller because I was focused on the error message, which is obviously a red herring. Try adding the controller to the hash: esponse.should redirect_to( :controller => ''static_pages'', :action => ''show'', :id => @static_page.permalink ) If that works, then please submit a bug report to the tracker (that redirect_to does not work with action + id unless you specify the controller). Thanks, David> > And here goes the full backtrace: > > > ActionController::MethodNotAllowed in ''StaticPagesController Handling > POST /pages With successful save Should redirect to the new page'' > Only get, put, and delete requests are allowed. > /usr/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/routing.rb:1439:in > `recognize_path'' > /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:43:in > `path_hash'' > /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:38:in > `hash_from_url'' > /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:26:in > `actual_hash'' > /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:34:in > `actual_redirect_to_valid_route'' > /home/mauricio/workspace/antares/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb:18:in > `matches?'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/expectations/handler.rb:19:in > `handle_matcher'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/expectations/extensions/object.rb:34:in > `should'' > ./spec/controllers/static_pages_controller_spec.rb:119: > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:78:in > `instance_eval'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:78:in > `run_with_description_capturing'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:19:in > `execute'' > /usr/lib/ruby/1.8/timeout.rb:48:in `timeout'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_methods.rb:16:in > `execute'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:292:in > `execute_examples'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:291:in > `each'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:291:in > `execute_examples'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/example/example_group_methods.rb:121:in > `run'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:22:in > `run'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in > `each'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/example_group_runner.rb:21:in > `run'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/options.rb:90:in > `run_examples'' > /home/mauricio/workspace/antares/vendor/plugins/rspec/lib/spec/runner/command_line.rb:19:in > `run'' > script/spec:4: > > > > > On Fri, Feb 22, 2008 at 11:00 AM, David Chelimsky <dchelimsky at gmail.com> wrote: > > On Fri, Feb 22, 2008 at 7:50 AM, Maur?cio Linhares > > <mauricio.linhares at gmail.com> wrote: > > > Hello guys, > > > > > > I have the following spec: > > > > > > describe ''With successful save'' do > > > > > > it ''Should redirect to the new page'' do > > > do_post > > > response.should be_redirect > > > response.should redirect_to( :action => ''show'', :id => > > > @static_page.permalink ) ## this is the line 118 > > > end > > > > > > end > > > > > > And when I try to run it it gives me the following error: > > > > > > 1) > > > ActionController::MethodNotAllowed in ''StaticPagesController Handling > > > POST /pages With successful save Should redirect to the new page'' > > > Only get, put, and delete requests are allowed. > > > ./spec/controllers/static_pages_controller_spec.rb:118: > > > script/spec:4: > > > > > > So, the response is a redirect (the "response.should be_redirect" > > > passes) but when i try to be sure that it redirected to the right page > > > it throws this weird error to me. Any ideas about what I''ve done > > > wrong? > > > > Can you post the full backtrace? > > > > script/spec ./spec/controllers/static_pages_controller_spec.rb -b > > > > > > > > > > I''m using RSpec 1.1.3 and Rails 2.0.2. > > > > > > -- > > > Maur?cio Linhares > > > http://alinhavado.wordpress.com/ (pt-br) | > > > http://codeshooter.wordpress.com/ (en) > > > Jo?o Pessoa, PB, +55 83 8867-7208 > > > _______________________________________________ > > > rspec-users mailing list > > > rspec-users at rubyforge.org > > > http://rubyforge.org/mailman/listinfo/rspec-users > > > > > _______________________________________________ > > rspec-users mailing list > > rspec-users at rubyforge.org > > http://rubyforge.org/mailman/listinfo/rspec-users > > > > > > -- > > > Maur?cio Linhares > http://alinhavado.wordpress.com/ (pt-br) | > http://codeshooter.wordpress.com/ (en) > Jo?o Pessoa, PB, +55 83 8867-7208 > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
Hi David, First, using the controller doesn''t work also :) After some debugging here i found out why it was trowing the error, the RedirectTo matcher uses the ActionController::Routing::Routes.recognize_path method to discover if a path exists and this method takes two parameters, the path and the "environment" that the path is being requested. When my code was being matched, the redirect_to matcher generated the right path "/pages/test" and sent it two the recognize_path method, but this path is a Restful one and only GET, PUT and DELETEs are allowed and the RedirectTo matcher didn''t send any :method param, so when the path is being recognized and no method is sent it will never be recognized and thus that weird error is thrown. A simple way to solve this issue is change the path_hash method at the RedirectTo matcher to include the HTTP method being called: def path_hash(url) path = url.sub(%r{^\w+://#{@request.host}}, "").split("?", 2)[0] ActionController::Routing::Routes.recognize_path path, :method => :get end As you can only redirect to GET requests, this should not be a problem. Should i file a patch for this? Now, the two methods are working fine =D it ''Should redirect to the new page'' do do_post response.should redirect_to( page_path( :action => ''show'', :id => @static_page.permalink ) ) response.should redirect_to( :action => ''show'', :id => @static_page.permalink ) end -- Maur?cio Linhares http://alinhavado.wordpress.com/ (pt-br) | http://codeshooter.wordpress.com/ (en) Jo?o Pessoa, PB, +55 83 8867-7208 On Fri, Feb 22, 2008 at 11:25 AM, David Chelimsky <dchelimsky at gmail.com> wrote:> On Fri, Feb 22, 2008 at 8:10 AM, Maur?cio Linhares > > <mauricio.linhares at gmail.com> wrote: > > > > Using the "path" method the spec passes, but i don''t use the path > > method on my controller. First, here''s my controller code: > > > > def create > > @static_page = @event.static_pages.build(params[:static_page]) > > > > respond_to do |format| > > if @static_page.save > > flash[:notice] = ''Page was successfully created.'' > > format.html { redirect_to(:action => ''show'', :id => > > @static_page.permalink ) } ## thats what i''m testing agains > > format.xml { render :xml => @static_page, :status => > > :created, :location => @static_page } > > else > > format.html { render :action => "new" } > > format.xml { render :xml => @static_page.errors, :status => > > :unprocessable_entity } > > end > > end > > end > > > > And here is the spec: > > > > > > it ''Should redirect to the new page'' do > > do_post > > response.should be_redirect > > response.should redirect_to( page_path( :action => ''show'', :id > > => @static_page.permalink ) ) ## this one, with the page_path goes > > fine > > > > response.should redirect_to( :action => ''show'', :id => > > @static_page.permalink ) ## this one, without the page_path doesn''t > > work > > end > > > > It seems that the redirect_to matcher doesn''t recognize the current controller. > > Ah. I missed that the initial example was missing the controller > because I was focused on the error message, which is obviously a red > herring. > > Try adding the controller to the hash: > > esponse.should redirect_to( :controller => ''static_pages'', :action => > > ''show'', :id => @static_page.permalink ) > > If that works, then please submit a bug report to the tracker (that > redirect_to does not work with action + id unless you specify the > controller). > > Thanks, > David >
On Fri, Feb 22, 2008 at 9:20 AM, Maur?cio Linhares <mauricio.linhares at gmail.com> wrote:> Hi David, > > First, using the controller doesn''t work also :) > > After some debugging here i found out why it was trowing the error, > the RedirectTo matcher uses the > ActionController::Routing::Routes.recognize_path method to discover if > a path exists and this method takes two parameters, the path and the > "environment" that the path is being requested. When my code was being > matched, the redirect_to matcher generated the right path > "/pages/test" and sent it two the recognize_path method, but this path > is a Restful one and only GET, PUT and DELETEs are allowed and the > RedirectTo matcher didn''t send any :method param, so when the path is > being recognized and no method is sent it will never be recognized and > thus that weird error is thrown. > > A simple way to solve this issue is change the path_hash method at the > RedirectTo matcher to include the HTTP method being called: > > def path_hash(url) > path = url.sub(%r{^\w+://#{@request.host}}, "").split("?", 2)[0] > ActionController::Routing::Routes.recognize_path path, :method => :get > end > > As you can only redirect to GET requests, this should not be a > problem. Should i file a patch for this?That would be great, thanks! Please do review http://rspec.lighthouseapp.com/projects/5645/how-to-file-a-ticket before you do. Thank you, David> > Now, the two methods are working fine =D > > > it ''Should redirect to the new page'' do > do_post > > response.should redirect_to( page_path( :action => ''show'', :id > => @static_page.permalink ) ) > > response.should redirect_to( :action => ''show'', :id => > @static_page.permalink ) > end > > > -- > > Maur?cio Linhares > http://alinhavado.wordpress.com/ (pt-br) | > http://codeshooter.wordpress.com/ (en) > Jo?o Pessoa, PB, +55 83 8867-7208 > > > > > On Fri, Feb 22, 2008 at 11:25 AM, David Chelimsky <dchelimsky at gmail.com> wrote: > > On Fri, Feb 22, 2008 at 8:10 AM, Maur?cio Linhares > > > > <mauricio.linhares at gmail.com> wrote: > > > > > > > Using the "path" method the spec passes, but i don''t use the path > > > method on my controller. First, here''s my controller code: > > > > > > def create > > > @static_page = @event.static_pages.build(params[:static_page]) > > > > > > respond_to do |format| > > > if @static_page.save > > > flash[:notice] = ''Page was successfully created.'' > > > format.html { redirect_to(:action => ''show'', :id => > > > @static_page.permalink ) } ## thats what i''m testing agains > > > format.xml { render :xml => @static_page, :status => > > > :created, :location => @static_page } > > > else > > > format.html { render :action => "new" } > > > format.xml { render :xml => @static_page.errors, :status => > > > :unprocessable_entity } > > > end > > > end > > > end > > > > > > And here is the spec: > > > > > > > > > it ''Should redirect to the new page'' do > > > do_post > > > response.should be_redirect > > > response.should redirect_to( page_path( :action => ''show'', :id > > > => @static_page.permalink ) ) ## this one, with the page_path goes > > > fine > > > > > > response.should redirect_to( :action => ''show'', :id => > > > @static_page.permalink ) ## this one, without the page_path doesn''t > > > work > > > end > > > > > > It seems that the redirect_to matcher doesn''t recognize the current controller. > > > > Ah. I missed that the initial example was missing the controller > > because I was focused on the error message, which is obviously a red > > herring. > > > > Try adding the controller to the hash: > > > > esponse.should redirect_to( :controller => ''static_pages'', :action => > > > > ''show'', :id => @static_page.permalink ) > > > > If that works, then please submit a bug report to the tracker (that > > redirect_to does not work with action + id unless you specify the > > controller). > > > > Thanks, > > David > > > > > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
David Chelimsky wrote:> On Fri, Feb 22, 2008 at 9:20 AM, Maur?cio Linhares > <mauricio.linhares at gmail.com> wrote: >> "/pages/test" and sent it two the recognize_path method, but this path >> ActionController::Routing::Routes.recognize_path path, :method => :get >> end >> >> As you can only redirect to GET requests, this should not be a >> problem. Should i file a patch for this? > > > That would be great, thanks! Please do review > http://rspec.lighthouseapp.com/projects/5645/how-to-file-a-ticket > before you do. >This bug are a ticket or not ? Because I have the same problem and I don''t find in lighthouse bug tracking. -- Posted via http://www.ruby-forum.com/.