Monkey patch no actionmailer base para adicionar host

Bráulio Bhavamitra braulio at eita.org.br
Sat Jul 6 10:42:24 BRT 2013


Olá comunidade,

Depois de quebrar a cabeça algumas horas finalmente descobrimos como fazer
o ActionMailer::Base não ignorar o default_url_options[:host], setado num
before_filter no controlador:
  def set_mailer_host
    ExchangePlugin::Mailer.default_url_options = {:host =>
request.host_with_port}
  end

Isto deveria colocar o host em todas as urls da view do mailer, tornando os
links acessíveis para o leitor do email. No entanto, não funciona.

Percebi que no noosfero muitas vezes é feito @url + url_for(), sendo @url
igual ao environment.top_url.
Considero isto ruim e repetitivo, sendo que a causa do problema está em
outro lugar...
A causa está no url_for abaixo:

http://apidock.com/rails/v2.3.2/ActionView/Helpers/UrlHelper/url_for

# File actionpack/lib/action_view/helpers/url_helper.rb, line 76
      def url_for(options = {})
        options ||= {}
        url = case options
        when String
          escape = true
          options
        when Hash
          options = { :only_path => options[:host].nil?
}.update(options.symbolize_keys)
          escape  = options.key?(:escape) ? options.delete(:escape) : true
          @controller.send(:url_for, options)
        when :back
          escape = false
          @controller.request.env["HTTP_REFERER"] || 'javascript:history.back()'
        else
          escape = false
          polymorphic_path(options)
        end

        escape ? escape_once(url) : url
      end

Veja que se não houver uma chave :host, ele set only_path = true. É isto
que faz com que o host do default_url_options seja ignorado.

Fiz então um monkey patch no mailer do plugin, substituindo o seguinte
método:

  def url_for(options = {})

    options ||= {}
    url = case options

    when Hash
      options[:only_path] = false;

    end
    super options

  end

Isto força o only_path para false.

*Seria interessante generalizar este monkey patch para todo o
ActionMailer::Base e fazer o before_filter mostrado acima no
application_controller.*

abraços,
bráulio

-- 
"Lute pela sua ideologia. Seja um com sua ideologia. Viva pela sua
ideologia. Morra por sua ideologia" P.R. Sarkar

EITA - Educação, Informação e Tecnologias para Autogestão
http://cirandas.net/brauliobo
http://eita.org.br
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-br/attachments/20130706/ca055c5d/attachment.html>


More information about the Noosfero-br mailing list