Ruby on rails 修复部分URL';s在Rails中用于URL缩短器
我正在按照说明制作一个URL缩短器 但是,本教程未涵盖的缺点/关键情况之一是,代码中定义的重定向“go”方法可以工作,如下所示: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
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”缺失