Rails No route matches {:controller=>“devise/products”}

。_饼干妹妹 提交于 2019-11-29 07:14:22
Jonathan Allard

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!

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!