如何在rails中获得完整的网址?
url_for @book只返回/ book / 1之类的路径而不是www.domain.com/book/1
谢谢(如果答案很明显,那就很抱歉。我正在学习铁路!)
答案 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_for
是ActionView::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'}))
。