2012-10-14 36 views
2

所以我需要打像mydomain.com/proxies/www.msn.com一個網址,以滿足一個APIRails的路由具有查詢字符串的URL

一些Ajax請求在我的路線我有

get "/proxies/:url" => "proxies#get" 

我在控制器我有

url_contents = Net::HTTP.get(URI.parse(params[:url])) 

它,如果我把/代理/ WWW我得到

undefined method `request_uri' for #<URI::Generic:0x3f89508 URL:www> 

,如果我把/proxies/www.msn.com

我得到

沒有路由匹配[GET] 「/proxies/www.msn.com」

+0

你使用**'rails-3。*'**?看起來你的標籤和路線有差異。 – Samiron

回答

-1
match '/proxies/:url' => 'proxies#get', :as => :proxies_get 
1

你有兩個單獨的問題在這裏:

  1. 您試圖將一個沒有方案的URL作爲HTTP URL。
  2. 您的/proxies路線將不會匹配:url s帶點和斜線您期望的方式。

對於第一個,你必須手動添加模式:

url = 'http://' + params[:url] 
content = Net::HTTP.get(URI.parse(url)) 

對於第二個,你可以使用一個圖示路由處理嵌入的斜線和:format => false保持Rails的從試圖把.com,例如,作爲格式:

get '/proxies/*url' => 'proxies#get', :format => false 

如果使用:url,Rails會見嵌入式斜線作爲組分分離,這就是可能不是你は什麼NT。沒有:format => false,Rails將嘗試將.X(對於任何X)解釋爲格式(就像.html.json,...),而不是URL的一部分。

+0

太棒了!但我只能在rails 3中應用這種方式。對於導軌2推薦什麼?我得到這個* http://stackoverflow.com/a/7782283/1160106*但仍不清楚。 – Samiron

+0

@Samiron:AFAIK Rails2中的'* url'會[表現相同](http://guides.rubyonrails.org/v2.3.8/routing.html#route-globbing)。你可以用':requirements => {:url => /.*/}'替換':format => false'來解決點問題。 –

0

這對軌道-2

的問題是與dot(.)我猜是適用的。我試過類似下面的東西,它工作。

#routes.rb 
map.get_proxy 'proxies/:url', :controller => "Proxies", :action => "get", :requirements => { :url => /.*/ } 

#view file 
#Here dot(.) are needed to replace with its encoded string %2E 
<%= link_to 'Get The Site', get_proxy_url('www.msncom') %> 


#Proxies Controller 
#After receiving the url the %2E need to conovert to dot(.) again. 
url_contents = Net::HTTP.get(URI.parse('http://'+params[:url])) 

改性如通過@mu說明。

+1

有更好的方法:':format => false'或':constraints => {:url => /.*/}'。 –