添加商品至购物车时出现ActionController::RoutingError路由匹配错误
问题解决:ActionController::RoutingError (No route matches [GET] "/order_items")
问题根源
你的路由中仅为order_items配置了POST请求的create动作(从rails routes输出可确认),但点击"Add to cart"链接时实际发起了GET请求,导致路由不匹配。
解决方案
方案1:确保Rails UJS/Turbo正确加载
link_to的method: :post依赖前端JS将默认的GET请求转换为POST请求,需确认项目中已正确加载对应工具:
Rails 7+(使用Turbo):
- 确保
Gemfile包含gem "turbo-rails",执行bundle install - 布局文件(如
app/views/layouts/application.html.erb)中添加:
或使用Turbo专用标签:<%= javascript_importmap_tags %><%= turbo_include_tags %>
- 确保
Rails 6及更早版本(使用UJS):
- 确保
Gemfile包含gem "rails-ujs",执行bundle install - 布局文件中添加:
并在<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>app/assets/javascripts/application.js中引入://= require rails-ujs
- 确保
方案2:改用表单提交(无需依赖前端JS)
如果不想依赖前端JS,直接用form_tag生成POST表单替代link_to,更稳定可靠:
修改show.html.erb中的代码:
<% if user_signed_in? %> <%= form_tag order_items_path do %> <%= hidden_field_tag :article_id, params[:id] %> <%= submit_tag 'Add to cart' %> <% end %> <% else %> <%= link_to 'Log In', new_user_session_path , class: "text-blue-500" %> <% end %>
额外检查点
- 确认
current_order方法能正确返回用户的未完成订单:
检查Order模型是否有user_id和status字段,且status的默认值或创建逻辑正确。 - 测试时可在
order_items_controller.rb的create方法开头添加日志,确认请求是否到达控制器:def create Rails.logger.info "Received POST request with article_id: #{params[:article_id]}" # 原有代码... end
内容的提问来源于stack exchange,提问作者AndresM
相关产品推荐
相关产品推荐

