Rails: сгенерируйте полный URL в представлении ActionMailer - PullRequest
16 голосов
/ 13 февраля 2010

Я использую ActionMailer для отправки электронного письма с подтверждением регистрации. В письме должна быть ссылка на сайт для проверки пользователя, но я не могу убедить Rails создать полный URL (включая домен и т. Д.).

Я использую:

<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>

на мой взгляд

Часть b:

В режиме разработки Rails жалуется, если я не укажу объяснение хоста в ссылке выше. Но я не хочу делать это в производстве. Любые решения?

Ответы [ 5 ]

17 голосов
/ 13 февраля 2010

Чтобы решить проблему передачи хоста для генерации URL в ActionMailer, проверьте этот плагин и причину , почему я написал его .

Для решения первой проблемы используйте именованные маршруты, когда это применимо. Вместо

<%= url_for :controller => 'login', :action => 'verify', :guid => @user.new_user.guid, :only_path => false, :host => 'http://plantality.com' %>

при условии, что маршрут называется login, используйте

<%= login_url(:guid => @user.new_user.guid) %>

Обратите внимание, я использую login_url, а не login_path.

12 голосов
/ 13 февраля 2010

Я не уверен, что это то, что вам нужно, но в config / средах / development.rb вы можете указать параметры по умолчанию для почтовых URL

config.action_mailer.default_url_options = {
  :host => "your.host.org",
  :port => 3000
}

вы можете сделать то же самое в config / средах / production.rb

6 голосов
/ 31 декабря 2014

Я не знаю, почему предыдущие решения кажутся такими сложными, но так как я здесь, почему бы не дать мне 2 цента ...

Перейти к /config/environments и добавить:

config.absolute_site_url = 'your site url'

для соответствующей среды (т. Е. В файлах development.rb, test.rb или production.rb). Перезагрузите веб-сервер.

Это позволяет вам позвонить Rails.application.config.absolute_site_url, чтобы получить нужный URL. Не нужно никаких плагинов или странных читов, просто сохраните URL сайта как переменную всего приложения.

0 голосов
/ 10 августа 2018

Чтобы сгенерировать URL, попробуйте это

Rails.application.routes.url_helpers.user_url(User.first.id, host: 'yourhost.io')

это сгенерирует URL следующим образом:

http://yourhost.io/users/1

Также вы можете передать некоторые параметры

expires = Time.now + 2.days
params = {expires: expires}
u = User.first.id

Rails.application.routes.url_helpers.user_url(u, params, host: 'host.com')

сгенерирует:

http://yourhost.io/users/1.expires=2018-08-12+15%253A52%253A15+%252B0300

, так что вы можете werifi в действии, если срок действия ссылки не истек

0 голосов
/ 06 декабря 2012

Я думаю, что это не на 100% правильный путь, но это также может быть решением:

См. Использование хостов активов в документации . Вам необходимо указать asset_host. Вы также можете построить его динамически из цепочки запросов "#{request.protocol}#{request.host_with_port}/login/?guid=#{@user.new_user.guid}"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...