url_for生成一个插入了当前路径的url

时间:2010-02-26 06:27:22

标签: ruby-on-rails

我正在我的控制器中生成一个URL,从相对路径“/ hangouts / test”访问,用于外部站点(facebook)上的URL。我想使用url_for并使用哈希传递参数,以便它可以逃脱它们。我想要的URL是:

http://www.facebook.com/connect/prompt_permissions.php?api_key=6aca22e72866c7eaaedfb15be69c4b93& ...

然而,使用它:

url_for(:host => "www.facebook.com/connect/prompt_permissions.php?", :api_key => Facebooker.api_key, :next => test_hangouts_url, :cancel => root_url, :ext_perm  => "publish_stream")

我改为在当时抛出/ hangouts / test的当前路径:

http://www.facebook.com/connect/prompt_permissions.php /环聊/测试 API_KEY = 6aca22e72866c7eaaedfb15be69c4b93&安培; ...

正如你所看到的,我不希望“/ hangouts / test”在那里 - 在API文档中有一些选项,但是难以理解,有人知道如何使用url_for而不插入当前路径吗?谢谢!

2 个答案:

答案 0 :(得分:2)

您不应该使用url_for的哈希表单来生成应用程序之外的链接。

相反,您应该只使用字符串版本形式:

url_for "http://www.facebook.com/connect/prompt_permissions.php?api_key=6aca22e72866c7eaaedfb15be69c4b93&next=#{test_hangouts_url}&cancel=#{root_url}&ext_perm=publish_stream"

url_for将使用当前操作控制器/ action / id,除非给url_for的哈希包含其中一个参数。然后,url_for将从与哈希中给出的参数匹配的路由生成URL。问题中使用的url_for参数会生成有效的url,因为它可以使用当前控制器/操作匹配路由。如果不匹配路由,您将无法使用网址的哈希形式生成所需的网址。在hash中提供url_for的控制器应该与rails在创建应用程序时为你生成的默认路由匹配,但这不是很干。

更好的解决方案是使用命名路线:

map.prompt_fb_permissions "/connect/prompt_permissions.php", 
  :host => "www.facebook.com", :controller => nil, :action => nil

然后,只要您想生成此网址,就可以使用以下内容代替url_。

prompt_fb_permissions(:api_key => Facebooker.api_key, :next => test_hangouts_url, 
  :cancel => root_url, :ext_perm  => "publish_stream")

答案 1 :(得分:0)

您遗漏了controller参数,这就是为什么它会自动将您的控制器路径(“/ hangouts / test”)添加到您的基本主机。

试试这个:

url_for(:host => "www.facebook.com", :controller=> "/connect/prompt_permissions.php", :api_key => Facebooker.api_key, :next => test_hangouts_url, :cancel => root_url, :ext_perm  => "publish_stream")