Rails 5中如何编写link_to生成"/path/id"格式的目标路径链接?
我来帮你梳理下解决思路哈,你要的是生成/path/id格式的链接,其中id是Person对象的ID而非Vote的,咱们从路由配置和link_to写法两个方面来调整:
一、先调整路由配置(核心步骤)
首先得确保路由能识别用Person ID作为路径参数,有两种常用方式:
1. 自定义单个路由(适合仅需特定动作的场景)
如果只需要针对某个动作(比如查看投票的show动作)生成目标路径,直接在config/routes.rb里添加自定义路由:
# 比如你要的path是votes,就这么写 get '/votes/:person_id', to: 'votes#show', as: :person_vote
这里的as: :person_vote是给路由起个命名,方便在link_to里调用。
运行rails routes命令可以看到这条路由的信息:
person_vote GET /votes/:person_id(.:format) votes#show
2. 修改资源路由的参数(适合整个Vote资源都基于Person ID的场景)
如果你的Vote资源所有操作都要用到Person ID作为路径标识,可以修改资源路由的param选项:
resources :votes, param: :person_id
这样所有Vote相关的路径都会用Person ID代替默认的Vote ID,比如vote_path(@person)会生成/votes/123(123是Person的ID)。
⚠️ 注意:这种方式下,你需要在VotesController里调整参数获取逻辑,比如show方法:
def show @person = Person.find(params[:person_id]) @vote = @person.vote # 假设Person和Vote是一对一关联,根据你的实际关联调整 end
二、正确编写link_to表达式
路由配置好后,对应的link_to写法就很清晰了:
对应自定义路由的写法
如果用了第一种自定义路由(as: :person_vote),直接传入Person对象即可,Rails会自动提取它的ID填充到路径里:
link_to '查看该用户的投票', person_vote_path(@person)
如果想手动指定参数也可以这么写:
link_to '查看该用户的投票', person_vote_path(person_id: @person.id)
对应修改param的资源路由写法
如果用了第二种资源路由配置,直接用Vote的命名路由传入Person对象:
link_to '查看投票', vote_path(@person) # 编辑页面的话就是 edit_vote_path(@person)
排查小技巧
如果还是生成不对的链接,先运行rails routes命令确认路由的命名和参数是否正确,比如有没有把:person_id作为路径参数,路由名称是不是你在link_to里用的那个。另外要确保视图里的@person对象是正确获取到的(比如在控制器里已经用@person = Person.find(params[:id])实例化了)。
内容的提问来源于stack exchange,提问作者user7055375

