RoR 3, Passenger, относительные URL-адреса и вспомогательные методы, такие как root_url - PullRequest
2 голосов
/ 10 мая 2011

Я действительно изо всех сил пытаюсь понять поведение маршрутизации, которое я вижу с приложением Rails 3, поскольку оно связано с методами Passenger и помощниками маршрутизации.Вот краткий обзор:

Когда пользователь регистрируется на моем сайте, я хотел бы отправить подтверждение по электронной почте, чтобы убедиться, что пользователь отправил действительный адрес электронной почты.Итак, я настроил почтовую программу на отправку пользователю URL-адреса с каким-то магическим токеном, тем самым доказав, что они получили отправленное мной электронное письмо.URL в теле письма генерируется с помощью вспомогательного метода маршрутизации (в данном случае verify_url("a1b2c3")), и URL вставляется в электронное письмо соответствующим образом как:

http://localhost:3000/verify/a1b2c3

Все это прекрасно работает под localhost:3000 без заминки.Поэтому, как ответственный разработчик, я в следующий раз перевожу свое приложение в удаленную среду контроля качества и проверяю, что все по-прежнему работает.Мой хостинг-провайдер использует Passenger, и я настроил его так, чтобы к моей среде контроля качества можно было обращаться следующим образом:

http://my.url/qa

Это делается путем установки RailsBaseURI в значение /qa в соответствующем файле .htaccess.Итак, я пытаюсь зарегистрироваться на сайте в моей среде QA и надеюсь, что вспомогательный метод verify_url генерирует следующий URL:

http://my.url/qa/verify/a1b2c3

Однако вместо этого я получаю:

http://my.url/verify/a1b2c3

Заметили явное отсутствие ссылки на путь 'qa'?Я искал различные блоги и руководства в поисках ответа, и я видел следующие предложения:

  • Установите переменную среды, такую ​​как ENV['RAILS_RELATIVE_URL_ROOT']
  • Установите ActionController::Base.relative_url_rootв моем environment/qa.rb
  • Добавить карту в мое config.ru, чтобы инициализировать мое приложение по определенному пути
  • Обернуть мои маршруты в область действия

Однако,Кажется, что каждый из них либо устарел (первые две опции), либо заканчивает тем, что выдает избыточную информацию о пути (вторые две опции) следующим образом:

http://my.url/qa/qa/verify/a1b2c3

Может кто-нибудь сказать мне правильный способ установить этотак, что когда я звоню verify_url("a1b2c3"), я на самом деле получаю правильный URL, включая относительный путь для моей среды QA?В идеале я бы хотел как-то установить это значение в environments/qa.rb, чтобы мне вообще не приходилось менять свое приложение при переходе из одной среды в другую.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Я бы отклонил целое /qa/ и переместил бы стадию в подобласть, такой как http://qa.my.url/ В противном случае вам придется внести изменения в код, которые могут негативно повлиять на производство.

Обновление

Я проигнорировал тот факт, что вы хотели использовать эти маршруты в электронных письмах. В этом случае вам нужно будет установить :host в помощнике по URL:

verify_url(:id=>"a1b2c3", :host=>"qa.my.url")

Чтобы сократить количество изменений, которые вы должны будете внести при запуске в производство, я бы посоветовал вам определить константу в инициализаторе (в /path/to/app/config/initializers/my_host.rb):

MY_HOST = 'qa.my.url'

После этого вы можете позвонить по номеру verify_url в шаблонах электронной почты, например:

verify_url(:id=>"a1b2c3", :host=>MY_HOST)

Как только вы приступите к работе, измените константу MY_HOST, и вам не придется беспокоиться о шаблонах.

По моему мнению, я никогда не использую *_url помощников, только *_path, чтобы обойти эту проблему.

0 голосов
/ 12 мая 2011

Проведя немного времени с документами ActionMailer, выясняется, что есть еще более простое решение, по крайней мере для того, чего я хочу достичь.Вукерплан определенно ответил на мой вопрос, но, похоже, я не совсем задавал правильный вопрос.: -)

Единственный раз, когда мне действительно нужно увидеть полный URL-адрес, это когда я работаю в почтовой программе, верно?В противном случае пути работают просто отлично.Что ж, получается, что ActionMailer позволяет вам задавать параметры URL по умолчанию для каждой среды.В моем файле конфигурации environments/development.rb у меня теперь есть следующее:

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

Когда я перехожу в свою среду QA, мне просто нужно сказать Passenger, что я запускаю из QAи что-то вроде этого environments/qa.rb config:

config.action_mailer.default_url_options = { :host => 'qa.my.url' }

Таким образом, код не должен менять один бит между средами, и, таким образом, я действительно невсе равно, какой домен, поддомен или порт я использую ... Это просто работает.Надеюсь, что это поможет кому-то еще в будущем.Спасибо!

...