Rails:confirm_X_url生成HTTP而非HTTPS及路由生成疑问
confirm_email_user_url生成及HTTPS问题的解答 嘿,我来帮你搞定这两个问题!
一、confirm_email_user_url的生成方式
你的判断没错,这个URL辅助方法确实底层依赖url_for,但它是Rails路由系统自动生成的命名辅助方法,具体来龙去脉是这样的:
路由定义是源头:
作者应该在config/routes.rb里给users资源添加了一个成员路由,用来处理邮箱确认的请求,代码大概长这样:resources :users do member do get 'confirm_email' # 定义一个GET请求的成员动作 end end这里的
member意味着这个动作是针对单个用户资源的,Rails会自动为它生成对应的URL辅助方法,命名规则就是[动作名]_[资源名]_url(对应绝对URL)和[动作名]_[资源名]_path(对应相对路径)。参数传递与
url_for的关联:
当你调用confirm_email_user_url(@user.confirm_token)时,这个token会作为路由参数传递(对应控制器里的params[:id],如果没自定义参数名的话),而整个方法最终会调用url_for来拼接出完整的URL,把主机、协议、路径和参数都整合起来。
二、解决生成HTTP而非HTTPS的问题
邮件里的URL默认用HTTP确实头疼,有几个实用的解决办法:
方法1:调用辅助方法时显式指定协议
直接在生成URL的时候加上protocol: :https参数,比如:<%= confirm_email_user_url(@user.confirm_token, protocol: :https) %>这种方式适合临时调整单个URL的协议。
方法2:全局配置Action Mailer默认协议
因为这个URL是在邮件模板里使用的,你可以在生产环境配置文件(config/environments/production.rb)里设置Action Mailer的默认URL选项,让所有邮件里的URL都默认用HTTPS:config.action_mailer.default_url_options = { protocol: 'https', host: '你的域名.com' # 比如 'example.com' }这样所有邮件模板里的路由辅助方法都会自动生成HTTPS链接,一劳永逸。
方法3:强制整个应用使用HTTPS
如果你的生产环境已经完全启用HTTPS,可以在production.rb里添加:config.force_ssl = true这个设置会让Rails的所有路由辅助方法默认生成HTTPS URL,同时强制所有HTTP请求跳转到HTTPS,适合全站HTTPS的场景。
内容的提问来源于stack exchange,提问作者RalphShnelvar

