Когда мы определяем маршруты в routes.rb
, используя имя типа map.some_link
. Мы можем использовать ссылку двумя способами: some_link_url
, some_link_path
.
- В чем разница между этими двумя?
- Что более безопасно использовать?
Когда мы определяем маршруты в routes.rb
, используя имя типа map.some_link
. Мы можем использовать ссылку двумя способами: some_link_url
, some_link_path
.
У меня был тот же вопрос, и я написал небольшой пост об этом в своем блоге
Причина суммирована здесь (я нашел это на форуме):
* _path для представлений, потому что ahrefs неявно связаны с текущим URL. Так что повторять это снова и снова было бы пустой тратой байтов. В контроллере, однако, * _url необходим для redirect_to, потому что спецификация HTTP требует, чтобы заголовок Location: в перенаправлениях 3xx был полным URL.
Вот еще одно объяснение, которое говорит, что это зависит от того, нужно ли нам использовать абсолютный URI при соединении с сайтом SSL с сайта без SSL, и наоборот.
То, что я прочитал до сих пор, не предполагает, что один из них более безопасен, чем другой. Это действительно сводится к тому, что является "правильным" использованием.
path
является относительным, а url
является абсолютным.
Пример разницы для ресурса, называемого "пользователь":
users_url # => http://localhost:3000/users
users_path # => /users
Тот же ответ, что и Petros, за исключением того, что современные браузеры обрабатывают относительные перенаправления просто отлично. (Я бы прокомментировал его ответ, но я пока не могу.)
Безопасным, если вы имеете в виду не подвергать всех переданных данных, тогда путь _path лучше, поскольку он генерирует относительный URL-адрес, например "/login", но _path дает " http://localhost:3000/login. Пожалуйста, обратитесь к этому сообщению в блоге, которое я нашел где-то назад относительно того же. Когда _url лучше, чем _path
_url даст весь путь. Поскольку он содержит имя домена и протокол, вы можете использовать его, например. для отправки электронной почты или перенаправления на другой домен и т.д.
_path вернет путь, который находится после "/" без домена, протокола и т.д. Поэтому вы можете использовать его время от времени (я думаю), где вам не нужны детали домена.
Помощник _url
генерирует строку, содержащую весь URL, в то время как хелпер _path
генерирует строку, содержащую относительный путь из корня приложения, например:
photos_url # => "http://www.example.com/photos"
photos_path # => "/photos"