Rails邮件发送器生成polls_url链接格式异常,如何修正?
解决Rails邮件中路由辅助方法生成异常URL的问题
这个问题的核心是你误用了集合路由和成员路由的辅助方法,咱们来快速修复它:
问题根源
polls_url(@poll) 是对应集合路由(也就是GET /polls的列表页)的辅助方法。当你把@poll对象传递给它时,Rails会错误地将poll的ID解析为URL的format参数,最终生成了http://example.com/polls.88这种不符合预期的格式。
而你实际需要的是指向单个poll详情页的成员路由,对应的辅助方法是单数形式的poll_url(@poll)(对应GET /polls/:id的详情页)。
修复步骤
1. 修改邮件模板中的路由调用
把邮件模板里的代码替换成下面的内容:
<h4>A new poll was created, <%= @poll.question %></h4> Check it at <%= poll_url(@poll) %> <p>Have a great day!</p>
2. 确认路由配置的正确性
检查你的routes.rb,确保已经正确定义了polls的资源路由:
Rails.application.routes.draw do resources :polls # 必须有这行,才能生成poll_url等辅助方法 # 你已有的bugs、projects路由... end
特殊情况:如果Poll是嵌套在其他资源下的
如果你的Poll是嵌套在Project这类资源下的(比如你routes里的resources :projects do resources :proje...可能没写完的部分是polls),那路由辅助方法需要同时传入父对象和poll对象:
# routes.rb的嵌套路由示例 resources :projects do resources :polls end
此时邮件模板里的调用要改成:
<%= project_poll_url(@project, @poll) %>
同时要确保你的邮件发送器里已经定义了@project这个实例变量,否则会报错。
验证
修改完成后重新触发邮件发送,应该会生成正确的URL格式,比如http://your-domain.com/polls/88(如果是嵌套路由则为http://your-domain.com/projects/xxx/polls/88)。
内容的提问来源于stack exchange,提问作者catmal
相关产品推荐
相关产品推荐

