目前我只允许用户插入指向外部图像的链接。因此,如果用户输入类似“1”的假网址,那么引用资产管道的任何内容都会中断。
我使用此助手
在视图级别上修复了此问题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
由于需要是双面的,我不想把它变成一种单一的方法。
答案 0 :(得分:1)
对于你的第一个问题,你走在正确的轨道上。在用户提交链接以获取UI级别验证之后,在使服务器执行任何实际工作之前,将助手作为custom validation的一部分进行调用。
您的帮助程序已包含第二个问题的部分解决方案。使用文件库,您可以从URL中提取文件的basename,如下所示:
current_name = File.basename(URI.parse(url).path)
然而,您可能希望在帮助程序中修改的一件事是使用名为url
的局部变量和名为url
的方法arg,以便清楚起见,以防您想要使用在方法中第二次传入arg。