2010-02-26 37 views
2

我在我的控制器中生成一个url,从相对路径“/ hangouts/test”访问,以获取外部网站(Facebook)上的url。我想使用url_for并使用散列传递参数,以便它可以逃脱它们。我想要的网址是:url_for生成当前路径插入的网址

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

我,而不是让我的电流/去处/测试在那里扔的路径:

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

正如你所看到的,我不想让“/ hangouts/test”在那里 - 与API文档中的选项一起玩了一下,但难住,任何人都知道如何使用url_for而不插入当前路径?谢谢!

回答

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哈希包含的那些论据之一url_for将使用当前的动作控制器/操作/ ID。然后,url_for将会根据与散列中给出的参数匹配的路由生成一个url。在问题中使用的url_for参数会生成有效的url,因为它可以使用当前控制器/操作匹配路由。您将无法使用url的哈希表生成所需的url,而无需匹配路由。在给你url_for的哈希中提供一个控制器应该与你在创建应用时为你生成的默认路由匹配,但这不是非常干燥。

更好的解决方案是使用一个名为路线:

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

那么你可以使用替代url_for以下,每当你想生成这个这个网址。

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

非常感谢你,EmFi - 我不知道url_for需要根据匹配路径生成;我本想通过哈希以比字符串“更优雅”:) – ambertch 2010-02-26 10:46:41

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