Ruby on rails Rails:使自定义URL帮助器的行为类似于内置路径&_url帮助程序
我很难找到将电子邮件确认URL添加到邮件程序的“Rails方式” 我选择不这样做纯粹是因为,嗯,文本电子邮件很难,因为他们不能提出请求 下面是我的路线。rb:Ruby on rails Rails:使自定义URL帮助器的行为类似于内置路径&_url帮助程序,ruby-on-rails,routes,helper,urlhelper,Ruby On Rails,Routes,Helper,Urlhelper,我很难找到将电子邮件确认URL添加到邮件程序的“Rails方式” 我选择不这样做纯粹是因为,嗯,文本电子邮件很难,因为他们不能提出请求 下面是我的路线。rb:get'confirm/:id'=>'Confirmations#confirm' 在我的邮件中,我想把email\u confirm\u url(@user.email\u token)放在我希望url出现的地方 我创建了一个助手: #app/helpers/confirmations_helper.rb module Confirmat
get'confirm/:id'=>'Confirmations#confirm'
在我的邮件中,我想把email\u confirm\u url(@user.email\u token)
放在我希望url出现的地方
我创建了一个助手:
#app/helpers/confirmations_helper.rb
module ConfirmationsHelper
def email_confirm_url(token)
"/confirm/#{token}"
end
end
除了我调用email\u confirm\u url(@user.email\u token)
时,这一切都可以正常工作
我的字面意思是:“/confirm/abcdefg…”
当我想要的是:http://myhostname/confirm/abcdefg…
或正在开发中:http://localhost:3000/confirm/abcdefg…
如何使URL助手的行为更像Rails中内置的\u路径
和\u URL
助手?虽然实际上我想我真的只需要\uURL
#编辑:我的环境配置中有:
#config/environments/development.rb
...
config.action_mailer.default_url_options = { :host => "localhost:3000" }
为了访问请求对象,您应该在邮件程序的控制器中实现此函数,并使用变量将其传递给模板
app/mailers/emailer.rb
@tracking_url = "http://#{request.host}:#{request.port}/confirm/#{token}"
app/view/emailer/template_name.html.erb
<%= link_to 'name', @tracking_url %>
使用已经存在的url加上连接怎么样?也就是说,您可以使用根路径
和根url
,然后连接,其行为与rails完全相同
例如,您可以执行以下操作:
def mystrangemethod_url(option1, option2)
"#{ root_url }/#{ option1 }/#{ option2 }"
end
你就完了。简单,唯一的要求是设置在routes.rb中设置根路径。另外,使用development.rb中设置的选项,它也可以在邮件程序中使用。我最近编写了一个帮助程序,将我的\u path
方法转换为\u url
方法
Rails使用ActionDispatch::Http::URL.full\u URL\u for
生成\u URL
方法,并传入Rails.application.routes.default\u URL\u选项来设置主机
、端口
和协议
这意味着您可以使用
ActionDispatch::Http::URL.full_url_for(Rails.application.routes.default_url_options.merge(path: path))
我的“正在工作”助手看起来像:
def self.url_helper(route_name)
define_method("#{route_name}_url") do |*args|
path = public_send(:"#{route_name}_path", *args)
options = Rails.application.routes.default_url_options.merge(path: path)
ActionDispatch::Http::URL.full_url_for(options)
end
end
然后可以将其与路径帮助器结合使用,以构建电子邮件\u确认\u url
方法:
url_helper :email_confirm
def email_confirm_path(token)
"/confirm/#{token}"
end
ActionView::Template::Error:nil:NilClass的未定义方法“host”
我想我记得一些关于无法访问邮件中的host
或host\u(带有端口)
?!?有什么办法吗?根据上面的评论更新答案,让我知道这是否有效。我认为Q更像是如何从视图中透明地访问mystrangemethod\u url
。