Ruby on rails 如何让定制主机为devise mailer工作?
我有一个域名为“www.mysite.com”的应用程序,它托管Drupal,而“app.mysite.com”托管Rails应用程序 我遇到过这样的情况:Deave邮件的url指向“www.mysite.com”,而不是“app.mysite.com” 在designe.rb中,我设置如下:Ruby on rails 如何让定制主机为devise mailer工作?,ruby-on-rails,ruby,ruby-on-rails-3,devise,Ruby On Rails,Ruby,Ruby On Rails 3,Devise,我有一个域名为“www.mysite.com”的应用程序,它托管Drupal,而“app.mysite.com”托管Rails应用程序 我遇到过这样的情况:Deave邮件的url指向“www.mysite.com”,而不是“app.mysite.com” 在designe.rb中,我设置如下: config.mailer = "Devise::Mailer" ActionMailer::Base.default_url_options = { :host => 'app.mysite.co
config.mailer = "Devise::Mailer"
ActionMailer::Base.default_url_options = { :host => 'app.mysite.com' }
<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>
<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token, :host => 'app.mysite.com') %>
和在生产中。rb:
config.action_mailer.default_url_options = { :host => 'app.mysite.com' }
ActionMailer::Base.smtp_settings =
{
:address => 'smtp.sendgrid.net', # SendGrid SMTP server
:domain => 'mysite.com', # SendGrid account domain name
:user_name => 'username', # SendGrid user name
:password => 'password', # SendGrid password
:enable_starttls_auto => true,
:port => 587,
:authentication => :plain,
}
在views/designe/mailer/reset_password_instructions.html.erb中,确认链接如下所示:
config.mailer = "Devise::Mailer"
ActionMailer::Base.default_url_options = { :host => 'app.mysite.com' }
<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>
<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token, :host => 'app.mysite.com') %>
@resource.reset\u password\u token)%>
它在单击忘记密码链接后成功发送电子邮件,并在本地主机上像charm一样工作,但url主机指向www.mysite.com
,而不是app.mysite.com
,并抛出404错误
如何将其指向正确的主机?看起来Deviate中的默认行为是从主域发送 以下是一个可能有帮助的页面:
我在查看了Desive wiki中描述的使用子域帮助器方法发送电子邮件的代码后,使其正常工作
module SubdomainHelper
def with_subdomain(subdomain)
subdomain = (subdomain || "")
subdomain += "." unless subdomain.empty?
host = Rails.application.config.action_mailer.default_url_options[:host]
[subdomain, host].join
end
def url_for(options = nil)
if options.kind_of?(Hash) && options.has_key?(:subdomain)
options[:host] = with_subdomain(options.delete(:subdomain))
end
super
end
end
这个helper方法所做的就是检查子域哈希是否存在。如果存在,则该方法将子域置于主机之前,并定义新主机名或默认主机名。我没有经历这个过程,因为出于某种原因,它在Rails3.2上不起作用,而且由于严格的时间限制,我不想浪费时间进一步深入研究它
我想等等,为什么不在mailerurl_中为方法显式定义主机名,而不是遍历所有这些方法呢
所以,我所做的就是,用散列键host
在mailer中定义link_to,并将值传递为我的子域。在那之后,它就像一个符咒:)
在views/designe/mailer/reset_password_instructions.html.erb中,确认链接如下所示:
config.mailer = "Devise::Mailer"
ActionMailer::Base.default_url_options = { :host => 'app.mysite.com' }
<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>
<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token, :host => 'app.mysite.com') %>
@resource.reset\u password\u令牌,:host=>'app.mysite.com')%>
谢谢@evanbikes,我找到了实现它的方法。我尝试了Desive wiki在您发布的上面的链接中解释的方式,但由于rails 3.2中的某些原因,它会抛出错误,而且由于我的截止日期,我不想浪费太多时间来深入研究它。所以,我的答案中解释了我的实现方式。天哪,这救了我!我一直在寻找一种方法,只有当它是另一个域的管理员密码rest请求,或者如果它是一个正常的用户在www上时,才能设置不同的主机。谢谢!