Полный URL с url_for в Rails - PullRequest
       2

Полный URL с url_for в Rails

22 голосов
/ 16 августа 2010

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

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

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

Ответы [ 6 ]

62 голосов
/ 16 августа 2010

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

url_for(@book, :only_path => false)

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

22 голосов
/ 16 августа 2010

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

book_url(@book)
13 голосов

В Rails 4, url_for принимает только один аргумент , поэтому вам нужно передать массив с явным хешем внутри для опции only_path.

Хорошо:

url_for([@post, @comment, {only_path: true}])

Bad:

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.

4 голосов
/ 20 января 2013

Похоже, это будет работать:

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")
1 голос
/ 16 августа 2010

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

url_for(@book, :host => "domain.com")
0 голосов
/ 03 апреля 2019

В Rails 5, если вам нужен полный URL для текущего контроллера / действия (== текущая страница), просто используйте:

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), вы увидите, что если вы передадите Hash (параметры ключевых слов преобразуются в Hash 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(request.params.merge({arbitrary_argument:'value'})).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...