rails params中的动态网址

时间:2016-12-14 09:03:59

标签: ruby-on-rails ruby api

我正在练习在rails中制作API。 api目前只有一个端点通过get请求接收url。我的路线是:

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
    namespace :api, defaults: { format: :json } do
      namespace :v1 do # resources :orders
        get "*link" => "application#parse_link"
      end
    end
end

我的应用程序控制器代码:

require 'open-uri'

class Api::V1::ApplicationController < ActionController::Base
    respond_to :json
  # protect_from_forgery with: :exception

  def parse_link

        begin

            url = URI.parse(params[:link])
            doc = Nokogiri::HTML(open(url).read)

        rescue
            redirect_to 'http://localhost:3000/'
        end

  end
end

当我发送这样的网址时:

http://localhost:3000/api/v1/http://stackoverflow.com/questions/41138538/dynamic-urls-in-rails-params

工作正常

但是以下类型的网址不起作用:

http://localhost:3000/api/v1/http://stackoverflow.com/

在这种情况下,它会拆分链接并给我这些参数

<ActionController::Parameters {"link"=>"http:/stackoverflow", "format"=>"com"} permitted: true>

正如你所看到的那样,它会拆分给定的网址并将其中的一半保存在链接参数和&#34; .com&#34;部分格式参数。

由于

1 个答案:

答案 0 :(得分:0)

尝试将defaults更改为constraints

Rails.application.routes.draw do
    namespace :api, constraints: { format: :json } do
      namespace :v1 do # resources :orders
        get "*link" => "application#parse_link"
      end
    end
end

注意:它会将格式约束为json,而不仅将其设置为默认值。 Rails在您的URL末尾处理.com作为响应类型。