#ruby-on-rails #ruby #windows #file-upload
#ruby-on-rails #ruby #Windows #загрузка файлов
Вопрос:
Я уже более десятка часов пытаюсь заставить загрузку файлов работать самостоятельно, и я не думаю, что смогу сделать это самостоятельно. Через несколько часов я не смог заставить Paperclip или Carrierwave работать, вероятно, потому, что я использую Windows, по крайней мере, на короткий срок. Я потратил еще несколько часов, пытаясь установить их вручную. Затем я потратил несколько часов, пытаясь заставить загрузку файлов работать без драгоценных камней. Я проработал каждую ошибку, и я думаю, что я очень близок. Я собираюсь опубликовать всю свою информацию. Ошибка и ошибка сделали код запутанным, но я подозреваю, что осталась только одна или две проблемы. Я работаю с каркасом блога. У меня есть статьи класса с комментариями класса, принадлежащими статьям, которые пытаются прикрепить файлы к статьям.
Моя текущая ошибка при попытке загрузки.
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, я не думаю, что она привыкает, и что это просто остатки от trail и error. Я получаю ту же ошибку, когда удаляю ее.
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
Я также создал файл picture_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 %>
Here’s my routes.rb. I split up :uploads from :comments to be safe, but I get the same error either way.
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'
I read somewhere to add a column to my table, so I added this migration called 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
Комментарии:
1. это отличный вопрос, и у меня возникла проблема, смогли ли вы его решить?
2. @BenSmith Это было давно, когда я впервые начал программировать, но нет. В конечном итоге я обнаружил, что сообщество Rails очень ориентировано на Mac, поэтому я перешел на другие языки.
Ответ №1:
Была ли у вас эта проблема до того, как вы запустили миграцию AddNewColumnToMyTable? Если нет, я вижу две проблемы. Сначала миграция, которую вы пытаетесь написать, должна выглядеть следующим образом:
class AddNewColumnToMyTable < ActiveRecord::Migration
def change
add_column :articles, :picture, :string
end
end
Это сообщило бы базе данных добавить столбец строки с именем picture в схему статей. Вторая проблема заключается в том, что вы добавляете «картинку» в модель, которая уже имеет отношение к модели с именем picture . Это означает, что миграция должна иметь другое имя для изображения:
class AddNewColumnToMyTable < ActiveRecord::Migration
def change
add_column :articles, :picture_id, :string
end
end
Если это не сработает, пожалуйста, опубликуйте свой файл schema.rb.
Комментарии:
1. Не повезло, та же ошибка. Вы хотели, чтобы я создал контроллер с именем AddNewColumnToMyTable_controller.rb со вторым блоком кода, потому что это то, что я сделал.
2. Это весь ваш файл schema.rb? У вас там даже нет таблицы статей.
3. Пропустил это. //ActiveRecord::Schema.define(версия: 20140630023622) сделать
4. Когда вы запускали миграцию AddNewColumnToMyTable, вы должны были получить сообщение об отсутствии таблицы с именем articles . Запускали ли вы rake db: migrate в своем терминале после создания миграции AddNewColumnToMyTable?
5. Ну, в любом случае вам нужно создать таблицу статей
Ответ №2:
Мы всегда используем подобные Paperclip
— поэтому я с удовольствием расскажу о способах решения вашей проблемы «совместимости» в Windows, если это нормально
По умолчанию Paperclip
будет работать на любой платформе, поскольку не зависит от каких-либо внешних зависимостей; ваша проблема, скорее всего, будет связана с интеграцией Paperclip с ImageMagick
(очень сложно разобраться):
—
ImageMagick
ImageMagick — это процессор, который позволяет Paperclip изменять различные параметры серверной части для ваших изображений. Это то, что позволяет выполнять изменение размера, обрезку и другие процессы изменения изображения при загрузке изображения.
Очень сложно приступить ImageMagick
к работе с Windows. Мы нашли лучший способ — использовать следующую версию:
Здесь есть отличный ресурс для загрузки предыдущих версий ImageMagick
—
Учитывая, что вы Paperclip
установили и перенесли свой драгоценный камень, вы должны иметь возможность загружать с помощью Paperclip; независимо от того, что происходит с другими частями системы
Комментарии:
1. У меня возникли проблемы с распознаванием терминалом paperclip еще до того, как я установил ImageMagick, и я следовал руководству, в котором рассказывалось о совместимости paperclip и imagemagick.
2. Хорошо, спасибо за комментарий! Есть ли у вас какая-либо ошибка, на которую вы могли бы сослаться? Я хочу исправить скрепку для вас — это намного лучше, чем использовать систему загрузки доморощенных