4

Drupalをホストしているドメイン「www.mysite.com」とRailsアプリをホストしている「app.mysite.com」のアプリがあります。

デバイスメーラーの URL が「app.mysite.com」ではなく「www.mysite.com」を指している状況があります。

devise.rb では、以下のように設定しています。

config.mailer = "Devise::Mailer"
ActionMailer::Base.default_url_options = { :host => 'app.mysite.com' }

そして production.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/devise/mailer/reset_password_instructions.html.erb では、確認リンクは次のようになります。

<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token) %>

パスワードを忘れた場合のリンクをクリックした後、電子メールを正常に送信し、localhost でチャームのように動作しますが、URL ホストがwww.mysite.com代わりにポイントしapp.mysite.com、404 エラーをスローします。

どうすれば正しいホストを指すことができますか?

4

2 に答える 2

4

Deviseのデフォルトの動作は、メインドメインから送信することのようです。

これが役立つかもしれないページです: https ://github.com/plataformatec/devise/wiki/How-To:-Send-emails-from-subdomains

于 2012-05-22T00:06:21.393 に答える
4

サブドメインヘルパーメソッドを使用してメールを送信するためのdevise 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

このヘルパー メソッドが行うことは、サブドメイン ハッシュが存在するかどうかを確認することだけです。存在する場合、メソッドはサブドメインをホストの前に追加し、新しいホスト名を定義します。それ以外の場合はデフォルトのホスト名です。なんらかの理由で Rails 3.2 では機能しなかったため、このプロセスを実行しませんでした。また、時間の制約が厳しいため、これ以上掘り下げて時間を無駄にしたくなかったためです。

これらすべてのメソッドをトラバースするのではなく、メーラーの url_for メソッドでホスト名を明示的に定義しないでください。

だから、私がしたことは、メーラーでハッシュキーhostを使用して link_to を定義し、値をサブドメインとして渡すことだけでした。その後、それは魅力のように機能しました:)。

views/devise/mailer/reset_password_instructions.html.erb では、確認リンクは次のようになります。

<%= link_to 'Change my password', edit_password_url(@resource, :reset_password_token => @resource.reset_password_token, :host => 'app.mysite.com') %>
于 2012-05-23T02:45:25.933 に答える