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でそうするための最良の方法は何でしょうか?
この質問は2つに分けることができると思います。
最初の回答は上記のとおりです。 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
それを実現する方法は複数あります。 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"
したがって、一致の存在だけが必要な場合:
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 }
# will be true if the content type is included
VALID_CONTENT_TYPES.include? attachment.content_type.gsub!(/^(image\/[a-z]+).+$/, "\1")
image/jpeg; name=example3.jpg
が文字列の場合:
("image/jpeg; name=example3.jpg".split("; ") & VALID_CONTENT_TYPES).length > 0
つまり、VALID_CONTENT_TYPES配列とattachment.content_type
配列(タイプを含む)の共通部分(2つの配列に共通する要素)は0より大きい必要があります。
manyの方法の少なくとも1つです。