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

Ruby on Rails MVC中路由与控制器报错:No route matches [GET] "/home/1"

Ruby on Rails MVC中路由与控制器报错:No route matches [GET] "/home/1"

我来帮你分析并解决这个问题,你遇到的No route matches [GET] "/home/1"错误,核心问题是路由配置没有包含id参数的匹配规则,同时你的控制器逻辑需要接收id来查询文章,下面一步步来修正:


1. 错误根源解析

当前的路由配置有两个关键问题:

  • 你使用了单数的resource :pages,它是为单一实例资源设计的(比如当前用户的个人资料),不会生成带id的路由规则;
  • 嵌套的get 'home' => 'pages#home'路由没有定义动态参数id,无法匹配/home/1这种带ID的请求路径。

2. 修正路由配置

你需要为home路由添加id动态片段,同时根据需求选择合适的资源路由类型:

方案A:保留pages资源并添加带ID的home路由

Rails.application.routes.draw do
  # 保留原有健康检查、PWA相关路由
  get "up" => "rails/health#show", as: :rails_health_check
  get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker
  get "manifest" => "rails/pwa#manifest", as: :pwa_manifest

  # 用复数resources(适合多实例资源),并为home路由添加id参数
  resources :pages do
    get 'home/:id', to: 'pages#home', as: 'home'
  end
end

方案B:直接定义独立的带ID的home路由(如果不需要pages的其他资源路由)

如果你的场景只需要home这一个路由,完全可以简化:

Rails.application.routes.draw do
  # 保留原有健康检查、PWA相关路由
  get "up" => "rails/health#show", as: :rails_health_check
  get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker
  get "manifest" => "rails/pwa#manifest", as: :pwa_manifest

  # 独立的带ID的home路由
  get 'home/:id', to: 'pages#home', as: 'home'
end

3. 验证路由是否生效

运行Rails内置的路由检查命令,确认新路由已生成:

rails routes

如果用方案A,你会看到类似这样的路由条目:

pages_home GET    /pages/home/:id(.:format)  pages#home

如果用方案B,会看到:

home GET    /home/:id(.:format)  pages#home

4. 控制器与视图的小修正

控制器:添加异常处理(避免找不到文章时崩溃)

class PagesController < ApplicationController
  def home
    # 用find_by替代find,避免找不到文章时抛出ActiveRecord::RecordNotFound异常
    @article = Article.find_by(id: params[:id])
    
    # 处理文章不存在的情况
    if @article.nil?
      redirect_to root_path, alert: "指定的文章不存在"
    end
  end
end

视图:修复erb输出语法(添加=才能渲染内容)

你原来的视图中用了<% @article.title %>,这只会执行Ruby代码但不会输出内容,需要改成<%= %>:

<div>
  <p> <%= @article.title %> </p>
  <p> <%= @article.description %> </p>
</div>

5. 访问正确的路径

  • 方案A对应的访问路径:http://localhost:3000/pages/home/1
  • 方案B对应的访问路径:http://localhost:3000/home/1

补充路由知识参考

  • 单数resource vs 复数resources:单数资源适合代表全局唯一的资源(比如当前用户的资料),不生成带id的路由;复数资源用于多实例资源(比如文章、用户列表),会自动生成带id的CRUD路由。
  • 动态路由片段::id是路由中的动态参数,Rails会自动将其解析为params[:id]传递给控制器。

备注:内容来源于stack exchange,提问作者Mr.DevEng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 09:18:05