44

我正在使用Tmail 库,对于电子邮件中的每个附件,当我这样做时attachment.content_type,有时我不仅会得到内容类型,还会得到名称。例子:

image/jpeg; name=example3.jpg

image/jpeg; name=example.jpg

image/jpeg; name=photo.JPG

image/png

我有一组像这样的有效内容类型:

VALID_CONTENT_TYPES = ['image/jpeg']

我希望能够检查内容类型是否包含在任何有效的内容类型数组元素中。

在 Ruby 中这样做的最佳方式是什么?

4

5 回答 5

112

有多种方法可以做到这一点。您可以使用以下命令检查每个字符串,直到找到匹配项Enumerable#any?

str = "alo eh tu"
['alo','hola','test'].any? { |word| str.include?(word) }

尽管将字符串数组转换为正则表达式可能会更快:

words = ['alo','hola','test']
r = /#{words.join("|")}/ # assuming there are no special chars
r === "alo eh tu"
于 2012-04-18T18:42:43.733 回答
3

因此,如果我们只想存在匹配项:

VALID_CONTENT_TYPES.inject(false) do |sofar, type| 
    sofar or attachment.content_type.start_with? type
end

如果我们想要匹配,这将给出数组中匹配字符串的列表:

VALID_CONTENT_TYPES.select { |type| attachment.content_type.start_with? type }
于 2012-04-18T18:45:36.107 回答
3

如果image/jpeg; name=example3.jpg是字符串:

("image/jpeg; name=example3.jpg".split("; ") & VALID_CONTENT_TYPES).length > 0

即VALID_CONTENT_TYPES数组和attachment.content_type数组(包括类型)的交集(两个数组共有的元素)应该大于0。

这至少是许多方法中的一种。

于 2012-04-18T18:43:42.027 回答
2
# will be true if the content type is included    
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1") 
于 2012-04-18T18:51:02.480 回答
0

我想我们可以把这个问题一分为二:

  1. 如何清理不需要的数据
  2. 如何检查清理后的数据是否有效

第一个在上面得到了很好的回答。对于第二个,我会做以下事情:

(cleaned_content_types - VALID_CONTENT_TYPES) == 0

这个解决方案的好处是您可以轻松地创建一个变量来存储不需要的类型,以便稍后列出它们,如下例所示:

VALID_CONTENT_TYPES = ['image/jpeg']
cleaned_content_types = ['image/png', 'image/jpeg', 'image/gif', 'image/jpeg']

undesired_types = cleaned_content_types - VALID_CONTENT_TYPES
if undesired_types.size > 0
  error_message = "The types #{undesired_types.join(', ')} are not allowed"
else
  # The happy path here
end
于 2019-06-03T21:30:29.863 回答