Как я могу получить полный URL-адрес в рельсах?
url_for @book возвращает только путь, например /book/ 1, а не www.domain.com/book/1
Спасибо (и извините, если ответ очевиден. Я изучаю рельсы!)
Как я могу получить полный URL-адрес в рельсах?
url_for @book возвращает только путь, например /book/ 1, а не www.domain.com/book/1
Спасибо (и извините, если ответ очевиден. Я изучаю рельсы!)
Используйте параметр: host. Например, вы можете использовать:
url_for(@book, :host => "domain.com")
В соответствии с документами этого не должно произойти. Опция, которую вы ищете, - :only_path
, и по умолчанию она ложна. Что произойдет, если вы явно задали значение false?
url_for(@book, :only_path => false)
В то время как вы можете использовать url_for
, вы должны предпочесть метод Райана, когда можете - book_url(@book)
для полного URL-адреса или book_path(@book)
для пути.
Если это ресурс RESTful, вы сможете использовать это:
book_url(@book)
В Rails 4, url_for принимает только один аргумент, поэтому вам нужно передать массив с явным хешем внутри для параметра only_path
.
Хорошо:
url_for([@post, @comment, {only_path: true}])
Плохо:
url_for(@post, @comment, {only_path: true})
url_for([@post, @comment], {only_path: true})
Из источника url_for
с входом Array
только вызовы:
polymorphic_url([@post, @comment], {only_path: true})
как показано в ответе @moose.
Как отмечено @lime, only_path
обычно не требуется для polymorphic_url
, поскольку вы отличаете его на _url
_path
суффиксах.
Кажется, что это сработает:
url_for(@book)
Но это не так. Метод url_for принимает только один аргумент, который может быть либо строкой, либо экземпляром модели, либо хешем опций. Это довольно неудачно, поскольку, похоже, вам может понадобиться ссылка на @book и добавить такие параметры, как: only_path или: host.
Один из способов - использовать polymorphic_url, который будет отображать правильный абсолютный URL, даже если ваша модель (скорее всего) не является фактически полиморфной:
polymorphic_url(@book, :host => "domain.com")
Возможно, лучшим маршрутом будет использование именованного маршрута, который автоматически устанавливается для вас при объявлении ресурсов на ваших маршрутах или с использованием опции: as:
# in routes.rb:
resources :books
# or
get "books/:id" => "books#show", as: :book
# in your view:
book_path(@book, :host => "domain.com")
В Rails 5, если вы хотите url_for для текущего контроллера/действия (== текущей страницы), просто используйте url_for(only_path: false)
Длинный ответ:
В Rails 5 url_for
в представлении - это ActionView::RoutingUrlFor#url_for
. Если вы посмотрите на его исходный код (https://api.rubyonrails.org/classes/ActionView/RoutingUrlFor.html#method-i-url_for
), вы увидите, передали ли вы хэш (параметры ключевых слов преобразуются в хэш Ruby), он на самом деле вызывает super
, вызывая метод с тем же именем у своего предка.
ActionView::RoutingUrlFor.ancestors
показывает, что его первым предком является ActionDispatch::Routing::UrlFor
.
Проверяя его исходный код (https://api.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-i-url_for), вы прочтете это:
Ключи пропущенных маршрутов могут быть заполнены из параметров текущего запроса (например, controller,: action,: id и любых других параметров, которые размещены в пути).
Это очень хорошо, так как он автоматически создаст для вас URL для текущей страницы (или пути, если вы просто вызовите url_for
без only_path: false
). Он также будет интеллектуально игнорировать параметры строки запроса; если вам нужно объединить их, вы можете использовать url_for(params.merge({arbitrary_argument:'value'}))
.