I get the below error on my rails application when I try to login or register (I\'m using the Devise GEM for logins).
Routing Error
No route matches {:contro
Way late to the party, but this was my solution. Simply prefix the controller as absolute with "/". A little long and ugly, but returns link for a controller/action or a route passed. I use it to build menus driven from sql table.
# dynamic link_to
def menu_link(params, html_options=nil)
if params[:controller].present?
link_to params[:display], {controller: "/#{params[:controller]}", action: params[:resource]}, default_navigation_options(html_options)
elsif params[:route].present?
link_to params[:display], params[:route], default_navigation_options(html_options)
end
end
Look more closely at your stack trace:
Started GET "/users/sign_up" for 127.0.0.1 at 2012-12-02 18:47:23 -0500
Processing by Devise::RegistrationsController#new as HTML
Rendered /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/devise-2.1.2/app/views/devise/shared/_links.erb (0.3ms)
Rendered /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/devise-2.1.2/app/views/devise/registrations/new.html.erb within layouts/application (2.3ms)
Rendered products/_search.html.erb (0.3ms)
Product Load (0.1ms) SELECT DISTINCT product_type FROM "products"
Rendered products/_product_typeDistinctList.html (0.5ms)
Rendered cart/_cart.html.erb (0.7ms)
Completed 500 Internal Server Error in 14ms
ActionController::RoutingError (No route matches {:controller=>"devise/products"}):
app/views/cart/_cart.html.erb:49:in `_app_views_cart__cart_html_erb___3785130162884562793_21827300'
app/views/layouts/application.html.erb:59:in `_app_views_layouts_application_html_erb___2170720560050181211_22251920'
Rendered /home/jon/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/actionpack-3.2.8/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.5ms)
Found it? The log shows it has rendered a bunch of partials, down to cart/_cart.html.erb
. It even tells you the error happens on line 49. Now what's on line 49? This:
<%= link_to 'Keep Shopping', :controller => :products %>
<%= link_to 'Empty Cart', :controller => "cart", :action => "clearCart" %>
<%= link_to 'Proceed to Check Out', :controller => "cart", :action => "createOrder" %>
As Ryan rightly points out in the following comment, Rails is looking for a partial scoped under Devise
since this is the one under which you're rendering.
More simply, you can just feed it the route name (the one you'll find in rake routes
) to which you add _path
for a helper to form a URL. products_path
ends up being the URL string for products#index
.
Which gives in your case
<%= link_to 'Keep Shopping', products_path %>
<%= link_to 'Empty Cart', clearCart_path %>
<%= link_to 'Proceed to Check Out', checkout_path %>
Listen to your stack traces, they're talking to you!