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

文字列の場合image/jpeg; name=example3.jpg

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

つまり、VALID_CONTENT_TYPES配列とattachment.content_type配列(タイプを含む)の交差(2つの配列に共通の要素)は0より大きくなければなりません。

それは多くの方法の少なくとも1つです。

于 2012-04-18T18:43:42.027 に答える
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 に答える
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

この質問は2つに分けることができると思います。

  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 に答える