Ruby on Rails中User与Userdetail一对一关系如何配置路由及跳转链接
Ruby on Rails 一对一关联路由配置解决方案
第一步:routes.rb 配置
两种常用配置方案,按需选择:
方案1:嵌套路由(推荐,符合关联关系语义)
因为Userdetail从属User,一对一关联使用单数resource声明:
Rails.application.routes.draw do # 其他原有路由 resources :users do resource :userdetail # 单数resource对应has_one关联,生成单例嵌套路由 end end
执行rails routes命令可以查看到生成的路由helper为user_userdetail_path,需要传入对应用户实例作为参数。
方案2:单例顶级路由(适合仅允许查看当前登录用户详情的场景)
不需要嵌套,直接声明单例资源:
Rails.application.routes.draw do # 其他原有路由 resource :userdetail end
生成的路由helper为userdetail_path,无需传参,需要在UserdetailsController的show动作中手动绑定当前登录用户的详情数据:
class UserdetailsController < ApplicationController def show @userdetail = current_user.userdetail end end
第二步:修正视图中的链接写法
对应方案1的链接写法
<%# 传入需要查询详情的用户实例,此处以devise默认的current_user为例 %> <%= link_to 'User Information', user_userdetail_path(current_user) %>
如果需要兼容无详情的用户,可加判断避免404:
<% if current_user.userdetail.present? %> <%= link_to 'User Information', user_userdetail_path(current_user) %> <% else %> <%= link_to '完善个人信息', new_user_userdetail_path(current_user) %> <% end %>
对应方案2的链接写法
<%= link_to 'User Information', userdetail_path %>
原链接报错原因
你之前的写法缺少两个必要条件:
- 路由中没有声明
userdetail相关的路由规则,Rails找不到对应的路由helper - 就算配置了路由,单数资源路径也需要传入对应的资源/关联资源参数,没有参数无法生成正确的访问路径
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

