Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:使自定义URL帮助器的行为类似于内置路径&_url帮助程序_Ruby On Rails_Routes_Helper_Urlhelper - Fatal编程技术网

Ruby on rails Rails:使自定义URL帮助器的行为类似于内置路径&_url帮助程序

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

我很难找到将电子邮件确认URL添加到邮件程序的“Rails方式”

我选择不这样做纯粹是因为,嗯,文本电子邮件很难,因为他们不能提出请求

下面是我的路线。rb:
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