导轨 - 有效图像.如果有效,则仅捕获名称



目前我只允许用户插入指向外部图像的链接。因此,如果用户输入诸如"1"之类的虚假 URL,则引用资产管道的任何内容都会中断。

我使用此帮助程序在视图级别修复了此问题

def remote_image_exists?(url)
url = URI.parse(url)
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == 'https')
http.start do |http|
return http.head(url.request_uri)['Content-Type'].start_with? 'image'
end
end

但这并不能在提交过程中修复它(我可能会在表单提交中很好地使用此帮助程序(。

我正在尝试找到适当的方法来执行此操作(如果有?然后,一旦链接有效,有没有办法获取它的"当前"名称?例如,自然文件的名称?(AKA 如果我下载它,则默认为文件的名称(。

最终结果

多亏了选择的答案,我才能决定我想使用的逻辑。

def remote_image_exists?(url)
url = URI.parse(url)
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == 'https')
http.start do |http|
return http.head(url.request_uri)['Content-Type'].start_with? 'image'
end
end
def get_file_name(url)
if remote_image_exists?(url)
current_name = File.basename(URI.parse(url).path)
return current_name
else
return nil
end
end

由于需求是双面的,我不想把它归为一种单一的方法。

对于您的第一个问题,您走在正确的轨道上。在用户提交链接以获取 UI 级别验证后,在使服务器执行任何实际工作之前,调用帮助程序作为自定义验证的一部分。

您的帮助程序已包含第二个问题的部分解决方案。使用文件库,您可以从 URL 中提取文件的基本名称,如下所示:

current_name = File.basename(URI.parse(url).path)

但是,为了清楚起见,您可能希望在帮助程序中修改的一件事是使用名为url的局部变量和名为url的方法 arg,以防您想在方法中第二次使用传入的 arg。

最新更新