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

如何构建接收字符串ID而非数字ID的Rails link_to标签?

解决Rails 5中用字符串SEO名称生成投票链接的问题

嘿,这个场景我之前做项目时也遇到过,咱们一步步来搞定它~

核心思路

Rails的路由辅助方法默认会使用模型的to_param方法生成URL里的ID部分,默认返回的是数字类型的id字段。要想用你的person.seo_name作为链接里的ID,主要有两种靠谱的方式:


方法1:重写Person模型的to_param(推荐)

这种方式最优雅,一旦设置好,所有用到Person对象生成URL的地方都会自动用seo_name代替数字ID。

在你的app/models/person.rb里添加以下代码:

def to_param
  seo_name # 返回你定义的SEO名称字符串
end

然后直接在link_to里传入Person对象就行:

<%= link_to "查看该用户的投票", vote_path(person) %>

这样生成的URL就会是/votes/your-custom-seo-name,而且Rails会自动把your-custom-seo-name作为params[:id]传给VotesController的show方法,完美匹配你已经写好的逻辑。


如果你不想全局修改Person的to_param(比如某些场景还需要用数字ID),可以直接把seo_name作为参数传给路由辅助方法:

<%= link_to "查看投票", vote_path(id: person.seo_name) %>

这种方式更灵活,只在这个特定的link_to里使用SEO名称作为ID,生成的URL和方法1完全一致。


最后确认一下控制器逻辑

既然你说VotesController的show方法已经能处理数字或字符串ID,那确保你的控制器代码类似这样(根据你的模型关联调整):

def show
  if params[:id].match?(/^\d+$/)
    @vote = Vote.find(params[:id])
  else
    # 这里根据你的业务逻辑,比如通过Person的seo_name查找对应的Vote
    @vote = Vote.joins(:person).find_by(people: { seo_name: params[:id] })
  end
end

这样调整后,你的链接应该就能正常生成且能正确访问啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:46:15