有人可以向我解释如何使用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
答案 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"
}