Ruby on rails 如何让定制主机为devise mailer工作?

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

我有一个域名为“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.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上时,才能设置不同的主机。谢谢!