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
相关产品推荐
相关产品推荐

