Pergunta

Eu estou trabalhando em um e-mail bastante tradicional senha esqueceu - Quero enviar e-mail ao usuário uma alteração de senha de token incorporado em um link que eles podem clicar para mudar sua senha. Eu estou enviando através do ActionMailer tradicional.

Se eu usar um tag link_to normais

<%= link_to "click here", :controller => foo, :action => 'bar', :token => token %>

Eu recebo uma ligação relativa -. Bastante inútil a partir de um e-mail

Se eu adicionar

:only_path => false, então ele erros dizendo que eu preciso definir default_url_options[:host]. Os docs ActionController implica que você fazer isso, substituindo os métodos #default_url_options em seu controlador. Certamente há uma opção de configuração para dizer Rails o que é hostname é, sem acrescentar o meu próprio arquivo de configuração, analisá-lo, etc?

Foi útil?

Solução

default_url_options está disponível a partir config.action_mailer e deve ser definido no arquivo de configuração do seu ambiente.

Por exemplo, em config/environments/production.rb:

config.action_mailer.default_url_options = {
  :host => 'www.yourdomain.com'
}

Para os testes local, modificar config/environments/development.rb:

config.action_mailer.default_url_options = {
  :host => '127.0.0.1',
  :port => 3000
}

Então, supondo que você tenha uma rota nomeada chamado forgot_password_login, você pode gerar o link URL de login em sua mailer usando algo parecido com isto:

forgot_password_login_url(:token => 'a7s8q15sk2...')

Outras dicas

Você provavelmente vai querer set:. Protocol => 'https', bem como, btw

config.action_mailer.default_url_options = { 
    :host => "portal.example.com", 
    :protocol => 'https' 
}

Há uma outra alternativa, como descrito em http://pivotallabs.com/how-i-leaned-to-stop-hating-and-love-action-mailer/

Esta solução tem a vantagem de que ele não requer qualquer configuração (para menos de um aborrecimento), e funciona bem, desde que você enviar e-mails a partir de dentro controladores.

Mas se você está pensando em enviar e-mail, sem passar por um controlador (por exemplo, a partir de linha de comando ou em resposta a outro e-mail), você precisa da configuração estática.

Configuração default_url_options diretamente está obsoleta no Rails 3.1. Use url_for .

Adicionar um parâmetro :protocol para o valor padrão de substituição (http), :protocol => 'https://'. Isto irá criar url começando com "https: // ..." em vez de padrão "http: //"

Curiosamente, eu tive o mesmo problema que você fez, mas em testes de unidade (ao seguir railstutorial de Michael Hartl). Eu tinha essa linha no meu arquivo test.rb, mas que não ajuda:

config.action_mailer.default_url_options = { host: 'example.com', protocol: 'http' }

Eu também acrescentou outra linha como essa ao test.rb, e surpreendentemente isso resolveu a questão

default_url_options = { host: 'example.com', protocol: 'http' }

Configuração default_url_options diretamente está obsoleta no Rails 3.1

Use o url_for ajudante para criá-lo:

<%= link_to "click here", url_for(:controller => foo, :action => 'bar', :token => token, :host => 'www.yourdomain.com') %>

Você pode apenas fazer

<%="click here", :controller => foo, :action => 'bar', :token => token, :host=>request.host -%>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top