使用Carrier Wave上传文件时出错

时间:2014-04-01 15:57:46

标签: ruby-on-rails

我有CarrierWave正常工作,直到我必须更改我的桌子上的字段名称(CarrierWave已安装到的字段),现在当我尝试上传文件时,我得到:< / p>

**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 %>

我通过迁移更改了上传列名称(&#39;路径&#39;到道路&#39;),当然,我尝试更改了所有&#39;路径&# 39;我的代码中的名称为&#39; road&#39; 。我试图关闭并多次打开服务器,错误仍然存​​在。

有任何帮助吗?

PS:

  

photo.rel = p

行导致错误。如果我发表评论,一切正常。但为什么这条线导致了这个问题呢?是的,我想要一个&#34; rel&#34;字段是&#34; road&#34;的完全副本。领域,但不是&#34;已安装&#34; (并观看)CarrierWave。

1 个答案:

答案 0 :(得分:1)

我认为这是因为您正在将上传器安装到road列。正如您使用以下代码指定的那样:

mount_uploader :road, UpperUploader

但是,当您尝试将其分配给rel时,它会引发错误TypeError (can't cast ActionDispatch ...,因为rel不是应该挂载上传器的列。

您可以在CarrierWave Documentation

中详细了解相关信息