路轨 - 有效图像。如果有效,则仅捕获名称

时间:2017-08-06 13:13:14

标签: ruby-on-rails validation

目前我只允许用户插入指向外部图像的链接。因此,如果用户输入类似“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

由于需要是双面的,我不想把它变成一种单一的方法。

1 个答案:

答案 0 :(得分:1)

对于你的第一个问题,你走在正确的轨道上。在用户提交链接以获取UI级别验证之后,在使服务器执行任何实际工作之前,将助手作为custom validation的一部分进行调用。

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

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

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