Rails для загрузки файлов в Windows без драгоценных камней

#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 6.8.7 Q16 (32-разрядная версия)

Здесь есть отличный ресурс для загрузки предыдущих версий ImageMagick

Учитывая, что вы Paperclip установили и перенесли свой драгоценный камень, вы должны иметь возможность загружать с помощью Paperclip; независимо от того, что происходит с другими частями системы

Комментарии:

1. У меня возникли проблемы с распознаванием терминалом paperclip еще до того, как я установил ImageMagick, и я следовал руководству, в котором рассказывалось о совместимости paperclip и imagemagick.

2. Хорошо, спасибо за комментарий! Есть ли у вас какая-либо ошибка, на которую вы могли бы сослаться? Я хочу исправить скрепку для вас — это намного лучше, чем использовать систему загрузки доморощенных