3

mp3 ファイルと pdf ファイルを添付するために、Rails 4.0.0 と Paperclip 4.1.1 を使用しています。カピバラとのRspecで統合テストを書いています。

両方のタイプのファイルに対して、コンテンツ タイプとファイル名の検証を実施しています。

class Song < ActiveRecord::Base
  validates :title, presence: true
  validates :writeup, presence: true

  has_attached_file :mp3
  validates_attachment :mp3,
    :content_type => { :content_type => "audio/mp3" },
    :file_name => { :matches => [/mp3\Z/] }

  has_attached_file :chords
  validates_attachment :chords,
    :content_type => { :content_type => 'application/pdf' },
    :file_name => { :matches => [/pdf\Z/] }

end

これを統合テストで使用して、有効な曲の属性を入力します。

def fill_in_valid_song
    fill_in("Title", with: "Valid Song")
    fill_in("Writeup", with: "Description of song")
    attach_file("Mp3", File.join(Rails.root, "/spec/factories/Amazing_Grace.mp3" ))
    attach_file("Chords", File.join(Rails.root, "/spec/factories/FakeChordChart.pdf" ))
  end

有効な曲を作成するための統合テストを実行すると、pdf ファイルは受け入れられますが、mp3 ファイルはコンテンツ タイプの検証に失敗します。

ブラウザで同じ手順を実行すると、曲はエラーなしで正常にアップロードされます。モデル スペックも同じファイルを使用して合格します。

ファイルを添付するときの「Mp3」の大文字「M」に問題があるのではないかと思いましたが、これは添付ファイルがどのファイル フィールドに含まれるかを指定するためのものです。小文字の「m」に変えてみたところ、カピバラがフィールドを見つけられないというエラーに変わりました。

4

1 に答える 1

4

mp3 ファイルのコンテンツ タイプの検証を次のように変更します。

validates_attachment :mp3,
    :content_type => { :content_type => ["audio/mpeg", "audio/mp3"] },
    :file_name => { :matches => [/mp3\Z/] }

mp3 ファイルのRFC定義の MIME タイプはaudio/mpeg. ただし、一部のブラウザーはそれらを次のようにロードしますaudio/mp3。これがおそらくブラウザーを介して機能する理由です。

これが機能しない場合は、追加することもできaudio/mpeg3ますaudio/x-mpeg-3。私が見たように、これらも使用されています。

于 2014-04-07T08:24:06.203 に答える