Rails 3.1 + Paperclip + jQuery fileupload - PullRequest
       32

Rails 3.1 + Paperclip + jQuery fileupload

10 голосов
/ 25 октября 2011

Я искал способ настроить Ruby on Rails 3.1 с Скрепкой и jQuery fileupload . Глядя на учебник на странице jQuery fileupload , я настроил систему, но не могу найти способ заставить скрепку обрабатывать загруженный файл.

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

# 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

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

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

Ответы [ 2 ]

8 голосов
/ 26 октября 2011

После некоторой борьбы с этой проблемой я обнаружил, что проблема возникает при добавлении :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 голос
/ 11 октября 2012

Если вы явно указали имя на file_field:

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

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

...