Rails 3.1 Скрепка загрузка файлов jQuery

#jquery #ruby-on-rails-3 #jquery-plugins #file-upload #paperclip

#jquery #ruby-on-rails-3 #jquery-плагины #загрузка файлов #скрепка

Вопрос:

Я искал способ настроить Ruby на Rails 3.1 с помощью Paperclip и jQuery fileupload. Просматривая учебник на странице jQuery fileupload, я настроил систему, но не могу найти способ заставить paperclip обрабатывать загруженный файл.

Вот что у меня есть (вкратце):

 # model
has_attached_file :photo ...

# view
= form_for @user, :html => {:multipart => true} do |f|
  f.file_field :photo, :multiple => true
  f.submit

# controller
def create
  @user = User.new params[:user]
  if @user.save
    render :json => [...]
end
  

Если я проверяю отправленные данные, я получаю все пользовательские свойства в параметрах [:user] и параметрах [:user][:photo], которые являются ActionDispatch::Http::UploadedFile . При вызове @user.save изображение не обрабатывается и не сохраняется.

Подсказка, руководство или решение будут высоко оценены!

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

1. Защита от массового присвоения User при необходимости добавления photo to attr_accessible ?

2. Спасибо @DouglasFShearer, я посмотрю и отчитаюсь. Если я правильно помню, я уже пробовал attr_accessible :photo .

Ответ №1:

После того, как я некоторое время боролся с этой проблемой, я обнаружил, что проблема возникает при :multipart => true добавлении в f.file_field , поскольку имя поля формы меняется с user[photo] на user[photo][] .

Использование отдельной страницы для прикрепления фотографий

Я хочу иметь отдельную страницу для загрузки нескольких файлов в запись (и еще одну для редактирования свойств пользователя). Это выглядит как временное решение, но оно работает. Вместо f.form_field :photo, :multipart => true того, чтобы я использовал form_field_tag 'user[photo]', :multiple => true в представлении.

Мой код выглядит так:

 ## app/model/user.rb
has_attached_file :photo

def to_fileupload_json
  {
    "name" => photo_file_name,
    "size" => photo_file_size,
    ...
  }
end

## app/views/photos/new.html.haml
= form_for @user, :url => users_path, :html => { :multipart => true } do |f|
  #fileupload
    = file_field_tag 'user[photo]', :multiple => true
    = f.submit

= javascript_include_tag "jquery.fileupload.js"
# require all other JS files needed for the plugin (jQuery, jQuery UI, ...)
= stylesheet_link_tag "jquery.fileupload-ui.css"
= render :partial => "jquery_file_templates" # partial with jQuery templates for responses 

:javascript
  $(function () {
      uploader = $('#fileupload').fileupload()
  }


## app/controllers/users_controller.rb
def create
  @user = User.create params[:user]
end
  

Если кто-нибудь еще знает лучший способ (правильный способ) сделать это, пожалуйста, дайте нам знать!

Использование fields_for

В зависимости от структуры вашего приложения вы можете рассмотреть возможность использования fields_for .

В этом случае вам придется:

  • добавить accepts_nested_attributes_for :photos в вашу (пользовательскую) модель
  • добавьте метод photos_attribues=(attributes) в свою (пользовательскую) модель и обработайте создание записи там
  • создайте запись для фотографий 3.times { @user.photos.build } в новом методе пользователя

Пример:

 def photos_attribues=(attributes)
  attributes.each do |key, value|
    photo = Photo.create :photo => value, ...
  end
end
  

Отказ от ответственности: приведенный выше код был упрощен / переписан, чтобы его было легче понять. Возможно, я допустил ошибки при удалении ненужного материала. И снова — я не совсем уверен, что это правильный способ решения этой проблемы. Предложения и улучшения более чем приветствуются!

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

1. У меня возникли проблемы с воссозданием ваших примеров здесь. Я могу увидеть плагин и выбрать несколько файлов, но вставляется значение NULL. Если у меня выбран только один файл без использования file_field_tag, то он работает просто отлично, но только для одного файла.

2. Кроме того, jquery не отображает файлы и индикаторы выполнения

3. @kobaltz проверьте имена полей формы и заголовки запросов и убедитесь, что они совпадают (что отправляет rails и что ищет jquery fileupload). У меня не было проблем с плагином, отображающим файлы вместе с размерами файлов и эскизами. Однако я не играл с индикатором выполнения.

4. Есть ли разумный способ разрешить загрузку любого количества файлов, а не только 3?

5. Уверен, что добавленный массив для пользователя [photo] [] вызван :multiple => true, а не:multipart => true . Кто-нибудь может подтвердить?

Ответ №2:

Если вы явно задаете имя на file_field :

 f.file_field :photo, multiple: true, name: 'user[photo]'
  

Rails будет генерировать user[photo] вместо user[photo][] .