我有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。
答案 0 :(得分:1)
我认为这是因为您正在将上传器安装到road
列。正如您使用以下代码指定的那样:
mount_uploader :road, UpperUploader
但是,当您尝试将其分配给rel
时,它会引发错误TypeError (can't cast ActionDispatch ...
,因为rel
不是应该挂载上传器的列。