2014-04-01 33 views
0

CarrierWave工作正常,直到我不得不对我的表更改字段名(其中CarrierWave被安装到现场),现在当我尝试上传文件,我得到:错误上载的文件上传波

**ActiveRecord::StatementInvalid in PhotosController#create** 
**TypeError: can't cast ActionDispatch::Http::UploadedFile to string: INSERT INTO "photos" ("album_id", "created_at", "rel", "road", "updated_at") VALUES (?, ?, ?, ?, ?)** 

我的代码:

Photo.rb

class Photo < ActiveRecord::Base 
    belongs_to :album 

    attr_accessible :legend, :road, :rel 

    mount_uploader :road, UpperUploader 
end 

的上传

class UpperUploader < CarrierWave::Uploader::Base 
    storage :file 
    def store_dir 
    "../app/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.album_id}" 
end 

上PhotosController的创建操作

def new 
    @photo = Photo.new 
end 

def create 
    params[:photo][:road].each do |p| 
     photo = Photo.new 
     photo.road = p 
     photo.rel = p 
     photo.album_id = session[:current_album] 
     photo.save 
    end 

    render 'manage' 
end 

def photo_params 
     params.require(:photo).permit(:legend, :road, :album_id, :rel) 
end 

我_form部分用来上传文件:

<%= form_for @photo , html: { multipart: true } do |f| %> 
    <% if @photo.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@photo.errors.count, "error") %> prohibited this photo from being saved:</h2> 

     <ul> 
     <% @photo.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :road %><br> 
    <%= f.file_field :road, :multiple => 'multiple' %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 

<% end %> 

我改变上传列名(什么是“道路“),通过迁移,当然,我试图改变所有'路径'的名字我的代码是'道路'。我试图关闭并打开服务器多次,错误仍然存​​在。

任何帮助?

PS:本

photo.rel = P

线导致错误。如果我评论它,一切正常。但为什么这条线导致这个问题呢?是的,我想要一个“rel”字段,它是“road”字段的完全副本,但CarrierWave并未“安装”(并且收看)该字段。

回答

1

我想这是因为你上传安装到road列。当你用下面的代码说明:

mount_uploader :road, UpperUploader

但是,当你试图将其分配给rel,它提出了一个错误TypeError (can't cast ActionDispatch ...,因为rel这不就是上传应安装在列。

您可以在CarrierWave Documentation