J'utilise la bibliothèque Tmail, et pour chaque pièce jointe dans un e-mail, quand je attachment.content_type
, parfois j'obtiens non seulement le type de contenu mais aussi le nom. Exemples:
image/jpeg; name=example3.jpg
image/jpeg; name=example.jpg
image/jpeg; name=photo.JPG
image/png
J'ai un tableau de types de contenu valides comme celui-ci:
VALID_CONTENT_TYPES = ['image/jpeg']
Je voudrais pouvoir vérifier si le type de contenu est inclus dans l'un des éléments de tableau des types de contenu valides.
Quelle serait la meilleure façon de le faire en Ruby?
Je pense que nous pouvons diviser cette question en deux:
Le premier est bien répondu ci-dessus. Pour le second, je ferais ce qui suit:
(cleaned_content_types - VALID_CONTENT_TYPES) == 0
La bonne chose à propos de cette solution est que vous pouvez facilement créer une variable pour stocker les types indésirables pour les répertorier plus tard comme cet exemple:
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
Il existe plusieurs façons d'y parvenir. Vous pouvez vérifier chaque chaîne jusqu'à ce qu'une correspondance soit trouvée à l'aide de Enumerable#any?
:
str = "alo eh tu"
['alo','hola','test'].any? { |Word| str.include?(Word) }
Bien qu'il puisse être plus rapide de convertir le tableau de chaînes en une expression régulière:
words = ['alo','hola','test']
r = /#{words.join("|")}/ # assuming there are no special chars
r === "alo eh tu"
Donc, si nous voulons simplement l'existence d'une correspondance:
VALID_CONTENT_TYPES.inject(false) do |sofar, type|
sofar or attachment.content_type.start_with? type
end
Si nous voulons les correspondances, cela donnera la liste des chaînes correspondantes dans le tableau:
VALID_CONTENT_TYPES.select { |type| attachment.content_type.start_with? type }
# will be true if the content type is included
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1")
Si image/jpeg; name=example3.jpg
est une chaîne:
("image/jpeg; name=example3.jpg".split("; ") & VALID_CONTENT_TYPES).length > 0
c'est-à-dire l'intersection (éléments communs aux deux tableaux) du tableau VALID_CONTENT_TYPES et attachment.content_type
le tableau (y compris le type) doit être supérieur à 0.
C'est au moins l'une des nombreuses façons.