【问题标题】:File upload won't work in Ruby on Rails 3 using Multipart Form文件上传在 Ruby on Rails 3 中使用 Multipart Form 不起作用
【发布时间】:2012-10-01 18:34:33
【问题描述】:

我有一个非常简单的上传文件配置。我只是想将带有描述的图像上传到数据库(我知道,我知道......)。就是这样。

这是我的模型的样子(我从 here 学到的)。基本上,这正是示例的设置方式,只有 attr_protected 行才能使用 Rails 3.2:

Photo < ActiveRecord::Base
  # note: there is also a :description attribute!!
  attr_protected :file_name, :content_type, :binary_data
  def image_file=(input_data)
    self.file_name input_data.original_filename
    self.content_type = input_data.content_type.chomp
    self.binary_data = input_data.read
  end
end

这是我非常简单的视图:

<h1>New Photo</h1>

<%= form_for(@photo) do |f| %>

  <fieldset>
    <legend>Upload a Photo</legend>

    <div class="control-group">
      <label class="control-label">Photo</label>
      <div class="controls">
        <%= f.file_field :image_file %>
      </div>
    </div>

    <div class="control-group">
      <%= f.label :description, class: "control-label" %>
      <div class="controls">
        <%= f.text_field :description, class: "text_field" %>
      </div>
    </div>

    <div class="form-actions">
      <%= f.submit "Upload", class: "btn btn-primary" %>
      <%= link_to "Cancel", photos_path, class: "btn" %>
    </div>
  </fieldset>

<% end %>

最后(仅出于完整性考虑),这是我的创建操作(简单的脚手架):

def create
  @photo = Photo.new(params[:photo])

  respond_to do |format|
    if @photo.save
      format.html { redirect_to @photo, notice: 'Photo was successfully created.' }
      format.json { render json: @photo, status: :created, location: @photo }
    else
      format.html { render action: "new" }
      format.json { render json: @photo.errors, status: :unprocessable_entity }
    end
  end
end

这个想法是用户将选择一个文件并键入一个小的描述,该描述应该发布到/photos 控制器上的“创建”方法。不幸的是,当我单击提交按钮时,我得到一个非常模糊的错误,它没有给我关于真正问题的信息:

ArgumentError in PhotosController#create

wrong number of arguments (1 for 0)
Rails.root: /Users/me/dev/photo-app

Application Trace | Framework Trace | Full Trace
app/models/photo.rb:4:in `image_file='
app/controllers/photos_controller.rb:43:in `new'
app/controllers/photos_controller.rb:43:in `create'
Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"qSjMHgjCDo2ORmTvnujrljfPCj6oekLI9KAz4x5gA7Q=",
 "photo"=>{"image_file"=>#<ActionDispatch::Http::UploadedFile:0x00000101726fd0 @original_filename="SomePic.jpg",
 @content_type="image/jpeg",
 @headers="Content-Disposition: form-data; name=\"photo[image_file]\"; filename=\"SomePic.jpg\"\r\nContent-Type: image/jpeg\r\n",
 @tempfile=#<File:/var/folders/kc/8hsmx29j3xn2_j_9tsw8bz6w0000gn/T/RackMultipart20121001-52387-lre7zh>>,
 "description"=>"my description"},
 "commit"=>"Upload"}

我查看了所有的 Google 和 StackOverflow,但似乎没有什么与我的(非常简单的)示例相匹配。任何帮助将不胜感激!

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby file-upload ruby-on-rails-3.2


    【解决方案1】:

    这里,image_file 只包含ActionDispatch 对象,而不包含文件的内容和描述,如下所述:

    "image_file" => #<ActionDispatch::Http::UploadedFile:0x00000101726fd0 original_filename="SomePic.jpg"
    

    这种上传文件的方式看起来很荒谬。无论哪种方式,您都必须通过阅读:tempfile 将内容写入您的上传位置

    【讨论】:

    • 感谢您提供的信息,但这对我来说意义不大。 :( 我应该记录下我不是 Ruby on Rails 开发人员,我正在尝试进行文件上传。一旦我让它在本地工作,我计划将它推送到 Heroku,并且需要能够将图像存储在服务器上。出于这一点,我将图像保存在数据库中而不是文件系统中。根据您上面的声明,我的模型代码会是什么样子?
    • 我强烈建议你看看MountUploader
    【解决方案2】:

    我接受了@kiddorails 的建议并实施了CarrierWaveAmazon Web Service。我的项目需要上传图片,而我仅限于 Heroku。因此,我潜入并弄清楚了。事后看来,这是最好的解决方案,但当时对于我的(示例)项目应用程序来说似乎有点过分了。这对我来说很棘手(作为“非 Ruby on Rails”开发人员)。

    归根结底,我会建议任何希望将图像存储到数据库中的人不要这样做,并且做与我相同的事情。学习正确的方法。 :)

    【讨论】:

      猜你喜欢
      • 2018-02-26
      • 2018-09-20
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-15
      相关资源
      最近更新 更多