You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加商品至购物车时出现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):

    1. 确保Gemfile包含gem "turbo-rails",执行bundle install
    2. 布局文件(如app/views/layouts/application.html.erb)中添加:
      <%= javascript_importmap_tags %>
      
      或使用Turbo专用标签:
      <%= turbo_include_tags %>
      
  • Rails 6及更早版本(使用UJS):

    1. 确保Gemfile包含gem "rails-ujs",执行bundle install
    2. 布局文件中添加:
      <%= 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  %>

额外检查点

  1. 确认current_order方法能正确返回用户的未完成订单:
    检查Order模型是否有user_id和status字段,且status的默认值或创建逻辑正确。
  2. 测试时可在order_items_controller.rb的create方法开头添加日志,确认请求是否到达控制器:
    def create
      Rails.logger.info "Received POST request with article_id: #{params[:article_id]}"
      # 原有代码...
    end
    

内容的提问来源于stack exchange,提问作者AndresM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:46:01