Windows文件上的Rails没有宝石上传

时间:2014-06-30 02:49:44

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

我一直在努力让文件上传自己工作十几个小时,我不认为我可以自己做。几个小时后,我无法使Paperclip或Carrierwave工作,可能是因为我使用的是窗户,至少在短期内如此。我花了几个小时试图手动安装它们。然后,我花了几个小时试图使文件上传工作没有宝石。我已经解决了每个错误,我认为我非常接近。我要发布我的所有信息。追踪和错误使代码变得混乱,但我怀疑只剩下一两个问题。我正在博客脚手架上工作。我有类文章,类评论属于文章,试图将文件附加到文章。

尝试上传时出现的当前错误。

ActiveRecord::AssociationTypeMismatch in ArticlesController#create
Picture(#46001052) expected, got ActionDispatch::Http::UploadedFile(#29170272)

以下是article_controller.rb的错误行。

@article = Article.new(article_params)

我觉得很奇怪,它预计#46001052但收到一个文件#29170272

这是我的article_controller.rb。我怀疑这是问题所在。 def上传我认为不会被使用,而且它只是来自跟踪和错误的遗留物。我删除它时会出现同样的错误。

class ArticlesController < ApplicationController

http_basic_authenticate_with name: "Goose", password: "123456",
except: [:index, :show, :new, :create]

def new
    @article = Article.new
end

def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render 'new'
end
end

def show
@article = Article.find(params[:id])
end

def index
@articles = Article.all
end

def edit
@article = Article.find(params[:id])
end

def update
@article = Article.find(params[:id])

if @article.update(article_params)
redirect_to @article
else
render 'edit'
end
end

def destroy
@article = Article.find(params[:id])
@article.destroy
redirect_to articles_path
end

def upload
uploaded_io = params[:article][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
end

private
def article_params
params.require(:article).permit(:title, :text, :picture)
end

end

为了以防万一,我还制作了一些带有类似东西的pictures_controller.rb。如果被问到会发帖。

这是我的article.rb模型

class Article < ActiveRecord::Base
has_many :comments, dependent: :destroy
has_one :picture, dependent: :destroy
validates :title, presence: true,
                length: { minimum: 5 }

  end

这是我的picture.rb模型

class Picture < ActiveRecord::Base
belongs_to :article
end

这是我的_form。我觉得这是对的。

<%= form_for @article, :html => { :multipart => true } do |f| %>
<% if @article.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@article.errors.count, "error") %> prohibited
  this article from being saved:</h2>
<ul>
<% @article.errors.full_messages.each do |msg| %>
  <li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.text_field :title , :size => "60X10" %>
</p>

<p>
<%= f.text_area :text , :size => "60x10" %>
</p>

<p>
<%= f.file_field :picture %>
</p>

<p>
<%= f.submit "Talk" %>
</p>
<% end %>

这是我的routes.rb。我分手了:上传来自:评论是安全的,但无论如何我都会得到同样的错误。

Blog::Application.routes.draw do

resources :articles do
resources :comments
end

resources :articles do
resources :uploads
end
root 'welcome#index'
end

Rails.application.routes.draw do
get 'welcome/index'

我在某处读到了向我的表添加一列,所以我添加了一个名为add_new_column_to_my_table.rb的迁移

class AddNewColumnToMyTable < ActiveRecord::Migration
def change
self.up
add_column :articles, :new_column, :picture
end

end
end

我还做了一个create_pictures.rb迁移。

class CreatePictures < ActiveRecord::Migration
def change
create_table :pictures do |t|
  t.string :image
  t.references :article, index: true
end
end
end

我想出了如何将文件保存到目录中,甚至为该文件提供了一个唯一的文件名,该文件名是创建它时的时间戳,但我还没想出如何将该文件链接到它的匹配文章。只是在我将文件创建为变量时节省了时间,但控制器显然不是一个好的地方。

我已经倾注了这个想法,很明显我需要帮助。我希望你能比这更容易解决这个问题。

更新:根据请求,这是我的schema.rb代码,看起来很可疑。

ActiveRecord::Schema.define(version: 20140630023622) do
create_table "comments", force: true do |t|
t.string   "commenter"
t.text     "body"
t.integer  "article_id"
t.datetime "created_at"
t.datetime "updated_at"
end

add_index "comments", ["article_id"], name: "index_comments_on_article_id"

create_table "data_files", force: true do |t|
t.datetime "created_at"
t.datetime "updated_at"
end

create_table "pictures", force: true do |t|
t.string "image"
end

create_table "uploads", force: true do |t|
t.string   "timestamp"
t.text     "fileid"
t.integer  "article_id"
t.datetime "created_at"
t.datetime "updated_at"
end

add_index "uploads", ["article_id"], name: "index_uploads_on_article_id"

end

2 个答案:

答案 0 :(得分:0)

在运行AddNewColumnToMyTable迁移之前,您是否遇到此问题?如果没有,我看到两个问题。首先,您尝试编写的迁移应如下所示:

class AddNewColumnToMyTable < ActiveRecord::Migration
  def change
    add_column :articles, :picture, :string
  end
end

这会告诉数据库将一个名为picture的字符串列添加到articles模式中。第二个问题是您正在将“图片”添加到已经与名为图片的模型有关系的模型中。这意味着迁移需要具有不同的图片名称:

class AddNewColumnToMyTable < ActiveRecord::Migration
  def change
    add_column :articles, :picture_id, :string
  end
end

如果这不起作用,请发布schema.rb文件。

答案 1 :(得分:0)

Paperclip

我们总是使用Paperclip之类的内容 - 所以我很乐意提供解决您的兼容性问题的方法。在Windows上问题,如果可以的话

默认情况下,Paperclip可以在任何平台上运行,因为它不会依赖任何外部依赖项;你的问题很可能是Paperclip与ImageMagick的整合(非常棘手):

-

<强> ImageMagick的

ImageMagick是允许Paperclip更改图像的不同后端选项的处理器。这是允许调整大小,裁剪和上传图像时要执行的其他图像更改过程。

ImageMagick与Windows一起工作非常棘手。我们发现最好的方法是使用以下版本:

  

ImageMagick 6.8.7 Q16 (32 bit)

可以下载excellent resource here以前版本的ImageMagick

-

考虑到你已经安装了Paperclip宝石&amp;迁移 - 您应该可以使用Paperclip上传;不管系统的其他部分发生了什么