我一直在努力让文件上传自己工作十几个小时,我不认为我可以自己做。几个小时后,我无法使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
答案 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
之类的内容 - 所以我很乐意提供解决您的兼容性问题的方法。在Windows上问题,如果可以的话
默认情况下,Paperclip
可以在任何平台上运行,因为它不会依赖任何外部依赖项;你的问题很可能是Paperclip与ImageMagick
的整合(非常棘手):
-
<强> ImageMagick的强>
ImageMagick是允许Paperclip更改图像的不同后端选项的处理器。这是允许调整大小,裁剪和上传图像时要执行的其他图像更改过程。
让ImageMagick
与Windows一起工作非常棘手。我们发现最好的方法是使用以下版本:
可以下载excellent resource here以前版本的ImageMagick
-
考虑到你已经安装了Paperclip
宝石&amp;迁移 - 您应该可以使用Paperclip上传;不管系统的其他部分发生了什么