2

所以我需要点击像 mydomain.com/proxies/www.msn.com 这样的 url 来满足一些对 API 的 ajax 请求

在我的路线中,我有

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

我在控制器中

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

如果我把 /proxies/www 我得到

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

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

我明白了

没有路由匹配 [GET] "/proxies/www.msn.com"

4

3 回答 3

1

你在这里有两个不同的问题:

  1. 您试图将没有方案的 URL 视为 HTTP URL。
  2. 您的/proxies路线不会:url像您期望的那样将 s 与点和斜线匹配。

对于第一个,您必须手动添加架构:

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

对于第二个,您可以使用 splat-route 来处理嵌入的斜线并:format => false防止 Rails 尝试将.com. 视为一种格式:

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

如果您使用:url,Rails 会将嵌入的斜杠视为组件分隔符,这可能不是您想要的。如果没有:format => false,Rails 将尝试将.X(对于任何X)解释为一种格式(就像.html, .json, ...)而不是 URL 的一部分。

于 2012-10-14T06:04:28.020 回答
0

这适用于 rails-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所述修改。

于 2012-10-14T06:06:11.203 回答
-1
match '/proxies/:url' => 'proxies#get', :as => :proxies_get
于 2012-10-14T05:21:18.053 回答