Pokud generujete URL v odesílaných e-mailech, tak logicky potřebujete, aby byly absolutní. Na druhou stranu psát absolutní URL do kódu je nepohodlné kvůli testování. Samozřejmě je možný výsledný URL zkopírovat do prohlížeče a tam ručně změnit adresu, ale to zkrátka není ono. Řešením je nastavit výchozí parametry pro volání url_for.

V ActionMaileru nejsou potřebné proměnné k dispozici, takže je musíte předat při vytváření e-mailu:

class FooController < ApplicationController
	def send_email
		url_options = {:host => request.host, :protocol => request.protocol.gsub('://', '')}
		url_options[:port] = request.port unless [80, 443].include?(request.port)
		mail = FooMailer.create_bar(url_options)
		...
	end
end

Tělo ActionMaileru potom vypadá takto:

class FooMailer < ActionMailer::Base
	include ActionController::UrlWriter
	def bar(url_options)
		...
		default_url_options.merge!(url_options)
	end
end

V šabloně e-mailu potom můžete normálně používat url_for s parametrem :o nly_path => false. Stejně tak musíte vždy explicitně definovat kontroler, neplatí že by byl použitý kontroler, ze kterého bylo voláno vytvoření e-mailu:

<%= link_to('click here',  url_for(:only_path => false, :controller => 'foo', :action => 'index')) %>
Zanechej komentář

K zanechání komentáře ke článku musíte být přihlášen. Přihlásit »