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

Rails中current_page?判断引发路由匹配错误问题求助

问题原因

当你使用current_page?(controller: 'users', action: 'show')时,Rails会尝试生成users#show对应的URL来和当前页面URL做对比,但users#show路由必须传入:id参数,你在判断逻辑里没有提供这个必填参数,导致非用户详情页(比如root_path)触发路由生成失败,抛出ActionController::UrlGenerationError。

解决方案

方案1:用内置变量直接判断(最简单高效)

视图中可以直接使用Rails内置的controller_name和action_name变量判断当前页面,完全避免路由生成操作,从根源解决报错:

<% if controller_name == 'users' && action_name == 'show' %>
    no navbar
<% else %>
<%= render partial: "shared/navbar" %>
<% end %>

方案2:修复current_page?调用(需传全参数)

如果一定要保留current_page?的写法,需要传入users#show所需的完整参数,同时处理非用户页无@user的情况:

<% if @user.present? && current_page?(user_path(@user)) %>
    no navbar
<% else %>
<%= render partial: "shared/navbar" %>
<% end %>

注:该方案依赖用户详情页中定义的@user变量,通用性不如方案1。

额外优化:整理路由配置

你当前重复定义了resources :users,可能引发路由冲突或冗余,建议合并为更清晰的写法:

Rails.application.routes.draw do
  # 单独定义不带/users前缀的用户详情页路由
  get '/:id', to: 'users#show', as: :user

  # User account
  devise_for :users,
    controllers: {
      omniauth_callbacks: "users/omniauth_callbacks",
      registrations: "users/registrations",
      sessions: "users/sessions"
    }
  devise_scope :user do
    get "session/otp", to: "sessions#otp"
  end

  # 用户其他路由(排除已单独定义的show),嵌套builduser资源
  resources :users, except: [:show] do
    resources :builduser, controller: 'users/builduser'
  end
  ...
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:55:15