Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 修复部分URL';s在Rails中用于URL缩短器_Ruby On Rails_Ruby_Url Rewriting_Url Shortener - Fatal编程技术网

Ruby on rails 修复部分URL';s在Rails中用于URL缩短器

Ruby on rails 修复部分URL';s在Rails中用于URL缩短器,ruby-on-rails,ruby,url-rewriting,url-shortener,Ruby On Rails,Ruby,Url Rewriting,Url Shortener,我正在按照说明制作一个URL缩短器 但是,本教程未涵盖的缺点/关键情况之一是,代码中定义的重定向“go”方法可以工作,如下所示: def go @link = Link.find_by_in_url!(params[:in_url]) redirect_to @link.out_url, :status => @link.http_status end 需要完整的url。因此,例如,虽然将用作输入url,但www.google.com或google.com将导致[BASE

我正在按照说明制作一个URL缩短器

但是,本教程未涵盖的缺点/关键情况之一是,代码中定义的重定向“go”方法可以工作,如下所示:

def go
    @link = Link.find_by_in_url!(params[:in_url])
    redirect_to @link.out_url, :status => @link.http_status
end
需要完整的url。因此,例如,虽然将用作输入url,但www.google.com或google.com将导致[BASEURL]/google.com或[BASEURL]/www.google.com用于重定向

我猜我要么需要在模型代码中使用正则表达式来检测http或www缺少的参数,要么编辑重定向到。有人能告诉我一种方法,允许缺少http或www参数的url用作url缩短器的输入url吗


谢谢。

根据
重定向到
方法()的文档,如果您传递的字符串参数不包含任何协议,它将重定向到通过将给定字符串附加到当前协议和主机而构建的url

因此,最好的方法是在
链接中使用
验证前调用
,该模型将协议添加到
输出url
属性:

before_validation :add_protocol_to_out_url

def add_protocol_to_out_url
  unless self.out_url.blank?
    self.out_url.slice!(/http:\/\/|https:\/\//)
    self.out_url = "http://#{self.out_url}"
  end
end

检查rails 5中完整的
URL缩写器
实现

在大多数情况下,给出的答案可能是正确的,但我不会依赖您自己编写的自定义正则表达式来处理所有情况。使用模块解析给定字符串,然后使用其方法获取所需内容:

require 'uri'

def normalize_url(in_url)
    uri = URI.parse(in_url)
    if uri.scheme.nil?
      uri.scheme = "http"
    end
    if uri.host.nil?
      uri.host = uri.path
      uri.path = ""
    end
    uri.to_s
end
您可能需要添加其他案例来处理“www”缺失