在Rails中使用url_for的完整URL

Vic*_*tor 22 ruby-on-rails

如何在rails中获得完整的URL?

url_for @book只返回像/ book/1这样的路径而不是www.domain.com/book/1

谢谢(如果答案很明显,那就很抱歉.我正在学习铁路!)

And*_*ell 64

根据文档,这不应该发生.您正在寻找的选项是:only_path默认情况下它是假的.如果将其明确设置为false会发生什么?

url_for(@book, :only_path => false)
Run Code Online (Sandbox Code Playgroud)

虽然你可以使用url_for你应该更喜欢Ryan的方法,你可以 - book_url(@book)完整的网址或book_path(@book)路径.

  • url_for(@ book,:only_path => false)在这里引发了一个异常,因为你在期望的时候已经传入了2个参数1.看起来他们会构建这个方法来接受选项,但是在最新版本的rails中它只接受一个:字符串/实例或选项的哈希. (10认同)
  • 这不起作用,至少在Rails 3.2.9中没有 (7认同)
  • 添加:only_path => false使用rails 3.1.1解决了它 (2认同)

Rya*_*igg 22

如果它是RESTful资源,您将能够使用它:

book_url(@book)
Run Code Online (Sandbox Code Playgroud)


Cir*_*四事件 13

在Rails 4中,url_for只接受一个参数,因此您需要为该only_path选项传递一个内部显式哈希的数组.

好:

url_for([@post, @comment, {only_path: true}])
Run Code Online (Sandbox Code Playgroud)

坏:

url_for(@post, @comment, {only_path: true})
url_for([@post, @comment], {only_path: true})
Run Code Online (Sandbox Code Playgroud)

从源头抓起,url_forArray输入只是调用:

polymorphic_url([@post, @comment], {only_path: true})
Run Code Online (Sandbox Code Playgroud)

如@ moose的回答所示.

如@lime所述,only_path通常不需要,polymorphic_url因为您将其与_url _path后缀区分开来.


a m*_*ose 5

看来这可行:

url_for(@book)
Run Code Online (Sandbox Code Playgroud)

但事实并非如此。url_for 方法仅接受一个参数,该参数可以是字符串、模型实例或选项哈希。这是相当不幸的,因为您似乎可能需要链接到 @book 并添加 :only_path 或 :host 等选项。

解决这个问题的一种方法是使用 polymorphic_url,即使您的模型(可能)实际上不是多态的,它也会呈现正确的绝对 url:

polymorphic_url(@book, :host => "domain.com")
Run Code Online (Sandbox Code Playgroud)

也许最好的路由是使用命名路由,它是在路由中声明资源或使用 :as 选项时自动为您设置的:

# in routes.rb:
resources :books
# or
get "books/:id" => "books#show", as: :book

# in your view:
book_path(@book, :host => "domain.com")
Run Code Online (Sandbox Code Playgroud)


ven*_*les 2

使用 :host 选项。例如,您可以使用:

url_for(@book, :host => "domain.com")
Run Code Online (Sandbox Code Playgroud)

注意:对于 Rails 3 及更高版本,请使用polymorphic_url代替url_for.

  • 我认为 Rails 3 不支持这一点 - 使用 polymorphic_url 可能会更好 (7认同)
  • 在 Rails 4 中,`url_for` 调用 `polymorphic_url`。 (2认同)