Подтвердить что ты не робот

Полный URL с url_for в Rails

Как я могу получить полный URL-адрес в рельсах?

url_for @book возвращает только путь, например /book/ 1, а не www.domain.com/book/1

Спасибо (и извините, если ответ очевиден. Я изучаю рельсы!)

4b9b3361

Ответ 1

Используйте параметр: host. Например, вы можете использовать:

url_for(@book, :host => "domain.com")

Ответ 2

В соответствии с документами этого не должно произойти. Опция, которую вы ищете, - :only_path, и по умолчанию она ложна. Что произойдет, если вы явно задали значение false?

url_for(@book, :only_path => false)

В то время как вы можете использовать url_for, вы должны предпочесть метод Райана, когда можете - book_url(@book) для полного URL-адреса или book_path(@book) для пути.

Ответ 3

Если это ресурс RESTful, вы сможете использовать это:

book_url(@book)

Ответ 4

В 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 суффиксах.

Ответ 5

Кажется, что это сработает:

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")

Ответ 6

В 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'})).