Rails:使自定义URL帮助程序的行为类似于内置的_path& _url帮助者

时间:2013-01-11 02:30:23

标签: ruby-on-rails routes helper urlhelper

我很难找到“Rails Way”来为邮件添加电子邮件确认网址。

我选择不完全以REST身份执行此操作,因为文本电子邮件很难处理,因为他们无法PUT请求。

所以这是我的routes.rb:get 'confirm/:id' => 'Confirmations#confirm'

在我的邮件程序中,我想将email_confirm_url(@user.email_token)放在我希望发生此URL的位置。

我创建了一个帮手:

#app/helpers/confirmations_helper.rb
module ConfirmationsHelper
  def email_confirm_url(token)
    "/confirm/#{token}"
  end  
end

这一切都有效,除非我致电email_confirm_url(@user.email_token) ...

我真的得到:“/confirm/abcdefg…

当我想要的是:http://myhostname/confirm/abcdefg…

或者在开发中:http://localhost:3000/confirm/abcdefg…

如何让我的URL帮助程序更像Rails中内置的<resource>_path<resource>_url帮助程序?虽然实际上我认为我只是需要 _url

#Edit:我在我的环境配置中有这个:

#config/environments/development.rb
...
config.action_mailer.default_url_options = { :host => "localhost:3000" }

3 个答案:

答案 0 :(得分:0)

为了访问请求对象,您应该在邮件程序的控制器中实现此功能,并将其传递给带有变量的模板。

应用程序/邮寄者/ emailer.rb

@tracking_url = "http://#{request.host}:#{request.port}/confirm/#{token}"

应用程序/视图/的emailer / template_name.html.erb

<%= link_to 'name', @tracking_url %>

答案 1 :(得分:0)

使用已有的网址加连接怎么样?即您可以使用root_pathroot_url,然后连接并且行为与rails完全相同!

例如,你可以这样做:

def mystrangemethod_url(option1, option2)
  "#{ root_url }/#{ option1 }/#{ option2 }"
end

你完成了。简单且唯一的要求是设置在routes.rb中设置根路径。还有你在development.rb中设置的选项,它也可以在邮件程序中使用。

答案 2 :(得分:0)

我最近编写了一个帮助器,将我的_url方法转换为ActionDispatch::Http::URL.full_url_for方法。

Rails使用_url生成Rails.application.routes.default_url_options方法,并传入host以设置portprotocolActionDispatch::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

我正在进行的工作助手看起来像:

email_confirm_url

然后可以将其与路径助手结合使用以构建url_helper :email_confirm def email_confirm_path(token) "/confirm/#{token}" end 方法:

PS C:\src\t> $s = '2018/05/21 21:21:54.118, GeForce GTX 1060 6GB, 00000000:01:00.0, 63, 100 %, 93 %'
PS C:\src\t> $s -match '.*, (\d*) %, (\d*) %$'
True
PS C:\src\t> $Matches

Name                           Value
----                           -----
2                              93
1                              100
0                              2018/05/21 21:21:54.118, GeForce GTX 1060 6GB, 00000000:01:00.0, 63, 100 %, 93 %


PS C:\src\t> $Matches[1]
100
PS C:\src\t> $Matches[2]
93