web-dev-qa-db-fra.com

Vérifiez si la chaîne contient une sous-chaîne dans un tableau dans Ruby

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?

34
Hommer Smith

Je pense que nous pouvons diviser cette question en deux:

  1. Comment nettoyer les données indésirables
  2. Comment vérifier si les données nettoyées sont valides

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
0
bonafernando

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"
87
cydparser

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 }
3
angusiguess
# will be true if the content type is included    
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1") 
2
noob

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.

2
Simon Bagreev