2017-09-16 53 views
0

有人请向我解释如何将音频文件作为附件(特别是mp3文件)上传到我的导轨应用程序中使用回形针的模型?Rails:用回形针上传音频文件(mp3),我错过了什么?

我一直在尝试年龄和迄今没有运气(即时疯狂)。

我的Rails应用程序只有一个模型称为磁道(其非常基本的),我安装了回形针创业板,并添加该代码到我的轨道模型,

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

然后我允许的参数在我的控制器,如所以:

private 

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

然后我把它添加到我的_form.html.erb,像这样:

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

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

有人可以告诉我我失踪了吗?

非常感谢,

蚂蚁

(以下全控制器代码)

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 

这里是轨道服务器代码时,从创建一个新的轨道,以提交表单..

Started GET "/tracks/new" for 127.0.0.1 at 2017-09-18 12:51:19 +0200 
Processing by TracksController#new as HTML 
    User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 14], ["LIMIT", 1]] 
    Genre Load (0.2ms) SELECT "genres".* FROM "genres" 
    Rendering tracks/new.html.erb within layouts/application 
    Rendered tracks/_form.html.erb (7.3ms) 
    Rendered tracks/new.html.erb within layouts/application (12.0ms) 
Completed 200 OK in 91ms (Views: 82.6ms | ActiveRecord: 0.6ms) 


Started POST "/tracks" for 127.0.0.1 at 2017-09-18 12:51:58 +0200 
Processing by TracksController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"kbvYCPTwS1WdI4lK3xLsnNKkrxJFo+y3mmJUIrhr5ceWjYQyjfqsVUNllQC1Ih13erBOi7VFFtNfjFuyPyhDlg==", "track"=>{"title"=>"Hello Sunshine", "description"=>"Track for Acoustic Style Videos", "price"=>"1.99", "audio"=>#<ActionDispatch::Http::UploadedFile:0x007feb1b300670 @tempfile=#<Tempfile:/var/folders/nn/k15ytbks3n30bk74txp8t2pc0000gn/T/RackMultipart20170918-13484-qqppq1.mp3>, @original_filename="Gravity by John Mayer.mp3", @content_type="audio/mp3", @headers="Content-Disposition: form-data; name=\"track[audio]\"; filename=\"Gravity by John Mayer.mp3\"\r\nContent-Type: audio/mp3\r\n">}, "genre_id"=>"1", "commit"=>"Create Track"} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ? [["id", 14], ["LIMIT", 1]] 
Command :: PATH=/usr/local/bin/:$PATH; file -b --mime '/var/folders/nn/k15ytbks3n30bk74txp8t2pc0000gn/T/a7583642b9fdf84dddb8dba14909ce6120170918-13484-c875vy.mp3' 
[paperclip] Content Type Spoof: Filename Gravity_by_John_Mayer.mp3 (audio/mpeg from Headers, ["audio/mpeg"] from Extension), content type discovered from file command: application/octet-stream. See documentation to allow this combination. 
    (0.1ms) begin transaction 
    Genre Load (0.3ms) SELECT "genres".* FROM "genres" WHERE "genres"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] 
Command :: PATH=/usr/local/bin/:$PATH; file -b --mime '/var/folders/nn/k15ytbks3n30bk74txp8t2pc0000gn/T/a7583642b9fdf84dddb8dba14909ce6120170918-13484-1xhh8so.mp3' 
[paperclip] Content Type Spoof: Filename Gravity_by_John_Mayer.mp3 (audio/mpeg from Headers, ["audio/mpeg"] from Extension), content type discovered from file command: application/octet-stream. See documentation to allow this combination. 
    (0.2ms) rollback transaction 
    Rendering tracks/new.html.erb within layouts/application 
    Rendered tracks/_form.html.erb (9.7ms) 
    Rendered tracks/new.html.erb within layouts/application (12.0ms) 
Completed 500 Internal Server Error in 88ms (ActiveRecord: 0.7ms) 



ActionView::Template::Error (undefined method `map' for nil:NilClass): 
    2: <%= simple_form_for @track do |f| %> 
    3: <%= f.input :title, label: "Track Name:" %> 
    4: <%= f.input :description %> 
    5: <%= select_tag(:genre_id, options_for_select(@genres), :prompt => "Select a Genre", class: "genre_select") %> 
    6: <%= f.input :price %> 
    7: <%= f.file_field :audio %> 
    8: <%= f.button :submit %> 

app/views/tracks/_form.html.erb:5:in `block in _app_views_tracks__form_html_erb___4605380733745630_70323911562620' 
app/views/tracks/_form.html.erb:2:in `_app_views_tracks__form_html_erb___4605380733745630_70323911562620' 
app/views/tracks/new.html.erb:4:in `_app_views_tracks_new_html_erb___4047185287574205786_70323904027580' 
app/controllers/tracks_controller.rb:34:in `create' 
+0

代码添加到您的形式'<%= @ track.errors.full_messages%>'来显示错误。 –

回答

0

对于所有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" 
} 
+0

嗨,我改变了我的代码到您的建议,但我似乎遇到的问题是,它实际上并没有将文件保存到数据库。我已经验证了我的模型和我的控制器中的音频文件,但是当我提交表单时,所有音频值在数据库中都保持为零,有什么建议吗?谢谢 - @Hammad Maqbool – AntChamberlin

+0

@AntChamberlin你可以在你提交表单时粘贴rails server log吗? –

+0

感谢您的回复哈马德。我在原始问题的底部粘贴了rails服务器代码。谢谢! @Hammad Maqbool – AntChamberlin