Rails:使用Paperclip上传音频文件(mp3),我缺少什么?

时间:2017-09-16 09:32:47

标签: ruby-on-rails ruby paperclip

有人可以向我解释如何使用Paperclip将音频文件作为附件(特别是mp3文件)上传到我的rails应用程序中的模型吗?

我已经尝试了很久,到目前为止没有运气(我疯了)。

我的rails应用程序只有一个名为Tracks的模型(非常基本),我安装了paperclip gem并将此代码添加到我的track模型中,

HttpConfiguration config = new HttpConfiguration();
config.Formatters.JsonFormatter.SerializerSettings.ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor;

然后我允许控制器中的参数,如下所示:

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

然后我将它添加到我的_form.html.erb中,如下所示:

  private

  def track_params
    params.require(:track).permit(:title, :description, :mp3)
  end

现在每当我尝试提交表单时,它都不会保存,只会再次呈现表单。

有人可以告诉我我错过了什么吗?

非常感谢,

蚂蚁

(下面的完整控制器代码)

<%= simple_form_for @track do |f| %>
  <%= f.input :title %>
  <%= f.input :description %>
  <%= f.file_field :mp3 %>
  <%= f.button :submit %>
<% end %>

以下是从创建新曲目到提交表单时的rails服务器代码..

class TracksController < ApplicationController
  before_action :find_track, only: [:show, :edit, :update, :destroy]

  def index
    @tracks = Track.all.order("created_at DESC")
  end

  def show
  end

  def new
    @track = Track.new
  end

  def create
    @track = Track.new(track_params)

    if @track.save
      redirect_to root_path
    else
      render 'new'
    end
  end

  def edit
  end

  def update
    if @track.update(track_params)
      redirect_to root_path
    else
      render 'edit'
    end
  end

  def destroy
    @track.destroy
    redirect_to root_path
  end

  private

  def track_params
    params.require(:track).permit(:title, :description, :mp3)
  end

  def find_track
    @track = Track.find(params[:id])
  end

end

1 个答案:

答案 0 :(得分:1)

对于所有mp3内容类型验证,请使用以下mimetypes:

    validates_attachment_content_type :audio,
  :content_type => [ 'audio/mpeg', 'audio/x-mpeg', 'audio/mp3', 'audio/x-mp3', 'audio/mpeg3', 'audio/x-mpeg3', 'audio/mpg', 'audio/x-mpg', 'audio/x-mpegaudio' ]

或者

您可以删除验证,然后检入数据库中保存内容类型的方式并添加该验证。

内容类型欺骗问题

paperclip.rb

中创建config/initializers文件
Paperclip.options[:content_type_mappings] = {
  :mp3 => "application/octet-stream"
}