在Rails中使用url_for的完整URL

时间:2010-08-16 00:17:35

标签: ruby-on-rails

如何在rails中获得完整的网址?

url_for @book只返回/ book / 1之类的路径而不是www.domain.com/book/1

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

6 个答案:

答案 0 :(得分:62)

根据the docs,这不应该发生。您要查找的选项是:only_path,默认情况下为false。如果将其明确设置为false会发生什么?

url_for(@book, :only_path => false)

虽然你可以使用url_for,但你可以选择Ryan的方法 - book_url(@book)获取完整网址或book_path(@book)获取路径。

答案 1 :(得分:22)

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

book_url(@book)

答案 2 :(得分:13)

在Rails 4中, url_for only takes one argument ,因此您需要为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后缀区分开来。

答案 3 :(得分:4)

这似乎有用:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

在Rails 5中,如果要使用当前控制器/操作(==当前页面)的完整URL,只需使用:

url_for(only_path: false)

长答案:

在Rails 5中,视图中的url_forActionView::RoutingUrlFor#url_for。如果您查看其源代码(https://api.rubyonrails.org/classes/ActionView/RoutingUrlFor.html#method-i-url_for),则会看到是否传递了Hash(Ruby将关键字参数转换为Hash),它实际上会调用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'}))