Маршрут URL помощник, ведущий к example.com
Почтовый файл
button_to 'YES', lender_accept_url(borrow), method: :post, id: "accept #{borrow.id}", style: "background-color:green; color: white; width: 40px; display: inline"
button_to 'NO', lender_decline_url(borrow), method: :post, id: "decline #{borrow.id}", style: "background-color:gray; width: 40px; display: inline"
Маршруты
post 'inventories/:id/accept', to: 'inventories#accept', as: 'lender_accept'
post 'inventories/:id/decline', to: 'inventories#decline', as: 'lender_decline'
Однако, когда я нажимаю кнопку в письме, я http://example.com/inventories/:id/decline
Почему помощник по URL не ведет к моему собственному домену? Обратите внимание, что этот же частичный элемент, используемый в файле Mailer, также используется на странице обычного просмотра, и на этой странице маршруты работают нормально.
1 ответ
Почтовые программы отделены от цикла запросов / ответов http: они не знают, что такое текущий запрос (как и ваши модели) и, следовательно, текущий хост. Они могут даже не использоваться из запроса (например, если ваши электронные письма отправляются из cronjob). С другой стороны, ваши представления могут смотреть на текущий запрос, чтобы узнать, какой текущий хост, поэтому они генерируют правильный URL.
Есть 2 способа решения этой проблемы:
Вы можете установить
config.action_mailer.default_url_options = { host: "example.com" }
в application.rb или в файлах среды.
В качестве альтернативы установите хост явно при вызове помощников URL. Для этого потребуется, чтобы тот, кто отправляет электронное письмо, передавал нужный хост почтовой программе (используя request.host
например). Почтовик будет хранить это в переменной экземпляра, например @host
и тогда, по вашему мнению, вы будете использовать
lender_accept_url(borrow, host: @host)
Недостатком этого является то, что для совместного использования представлений / частичных операций с обычными действиями контроллера вам также потребуется установить @host.
В качестве подхода на полпути вы также должны быть в состоянии установить default_url_options
на атрибут каждого экземпляра