在我的图库中上传文件在Rails 3中运行良好,但在升级后,我在此行wrong argument type ActionDispatch::Http::UploadedFile (expected String)
中获得了@reel.update_attributes(reels_params)
。
我没有使用任何gem来处理文件,因为我需要特定的处理并将我的文件存储在db中。升级到rails 4之后,我只添加了一种方法来处理控制器reels_params
中的强参数。
控制器:
class Admin::ReelsController < AdminController
before_action :set_reel, only: [:show, :edit, :update, :destroy]
def update
respond_to do |format|
if @reel.update_attributes(reels_params)
format.html { redirect_to admin_reel_path(@reel), notice: t('helpers.messages.update_success') }
else
format.html { render action: "edit" }
end
end
end
...
private
def set_reel
@reel = Reel.find(params[:id])
end
def reels_params
params.require(:reel).permit!
end
end
查看:
= form_for [:admin, @reel], :html => { :class => 'form-horizontal form-admin', :multipart => true } do |f|
.form-group
= f.label 'Gallery', :class => 'control-label col-sm-2'
.col-sm-10
- item.images.each do |img|
= f.fields_for :images, img do |img_f|
= img_f.text_field :title
= img_f.file_field :data, class: 'img_upload'
如何更正我的代码?
答案 0 :(得分:0)
为了解决这个问题,我将视图仅限于单个图像元素
<%= form_tag({action: :update}, multipart: true, method: "patch") do %>
<%= file_field_tag 'image' %>
<div class="actions">
<%= submit_tag %>
</div>
<% end %>
带控制器:
def update
@user.image = params[:image] <<------Fails on this line
respond_to do |format|
if @user.save ....
错误是: “错误的参数类型ActionDispatch :: Http :: UploadedFile(期望字符串)”
看这里: http://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html ...我们找到了“.read”选项,因此我将控制器修改为:
def update
@user.image = params[:image].read <<------added the suffix here
respond_to do |format|
if @user.save ...
它可以工作,我可以从文件中读回图像。因此,似乎我们需要单独隔离和保存blob,添加“.read”后缀,并且在修复此BUG /(特征)之前无法将其保存在具有其他参数的组中。