2

我正在使用 ActiveAdmin 创建“幻灯片”,它们实际上是在数据库中存储为二进制文件的图像:

class CreateSlides < ActiveRecord::Migration
  def change
    create_table :slides do |t|
      t.binary :image
      t.timestamps
    end
  end
end

我的管理脚本也很简单:

ActiveAdmin.register Slide do
  permit_params :image
  form do |f|
    f.inputs 'Slide details' do
      f.input :image, :as => :file
    end
    f.actions
  end 
end

所以当我按下“创建幻灯片”按钮时,我得到了这个异常:

wrong argument type ActionDispatch::Http::UploadedFile (expected String)

{"utf8"=>"✓",
 "authenticity_token"=>"A/Ux8rduVlaQQrimOV0qWFAhXR8ATJnfKupp03RVXmg=",
 "slide"=>{"image"=>#<ActionDispatch::Http::UploadedFile:0x007f1bb9515eb0 @tempfile=#<Tempfile:/tmp/RackMultipart20140507-20302-1yd7q93>,
 @original_filename="info.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"slide[image]\"; filename=\"info.jpg\"\r\nContent-Type: image/jpeg\r\n">,
 },
 "commit"=>"Create Slide"}

我昨天又开始使用 Rails,但我一直是个新手。我对“强参数”了解一些,我认为 UploadFile 对他们来说是有效的类型。所以很奇怪为什么我有这个错误。我使用 Rails 4.1 和 Active Admin 0.6.3。

4

1 回答 1

1

问题不在于“强参数” - 或者您收到“禁止...”错误。问题是 Rails 破坏了 save-blob-to-db 功能,至少在 Rails 3 中它是如何工作的。这次升级到 4 ......呃!

我在这里给出了一个解决方法: Trouble with uploading file after upgrating rails from 3.2 to 4

您必须在控制器中“修复”这个问题,方法是获取表单返回的内容 - 我猜是“params [:image]” - 并像这样添加“.read”:

@slide.image = params[:image].read
@slide.save

假设您为模型对象实例使用“@slide”。如果您的上面的代码被精简,您将获得单独隔离、删除和保存一个参数的额外乐趣,因为您不能再将它与其他参数一起保存。

见这里的方法为什么: http ://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html

于 2014-05-18T09:09:22.130 回答