Carrierwave Не удается массово назначить защищенные атрибуты: путь при загрузке с использованием jquery-fileupload-rails

Я пытаюсь заставить простую загрузку файлов работать, используя

  • jquery-fileupload-rails
  • несущая
  • туман

Я не могу найти причину следующей ошибки

Started POST "/pictures" for 127.0.0.1 at 2012-07-27 15:19:37 +0100
Processing by PicturesController#create as JSON
  Parameters: {"utf8"=>"✓",
  authenticity_token"=>"NKek0e/kfVRUk4SVBjokO5rL446dKvHo9+7mKuH0HKs=", "picture"=>   
  {"path"=>#  <ActionDispatch::Http::UploadedFile:0x00000002d48fa8 
  @original_filename="IMG_0001.JPG", @content_type="image/jpeg", @headers="Content-
  Disposition: form-data; name=\"picture[path]\"; filename=\"IMG_0001.JPG\"\r\nContent-
  Type: image/jpeg\r\n", @tempfile=#<File:/tmp/RackMultipart20120727-7807-1bcbfof>>}}
Completed 500 Internal Server Error in 1ms

ActiveModel::MassAssignmentSecurity::Error (Can't mass-assign protected attributes: 
path):
  app/controllers/pictures_controller.rb:9:in `new'
  app/controllers/pictures_controller.rb:9:in `create'

Модель, контроллер и представление взяты из

https://github.com/blueimp/jQuery-File-Upload/wiki/Rails-setup-for-V6

Сообщение об ошибке заставляет меня думать, что мне нужно сделать «путь» доступным, но как? Обратите внимание, что бит jquery-file-upload работает (у меня есть кнопки начальной загрузки, изображения появляются на экране и т. д., только сама загрузка файла явно не работает!)

Для полноты картины это picture.rb:

class Picture < ActiveRecord::Base

  include Rails.application.routes.url_helpers
  attr_accessible :avatar
  mount_uploader :avatar, AvatarUploader

  def to_jq_upload
    {
      "name" => read_attribute(:avatar),
      "size" => avatar.size,
      "url" => avatar.url,
      "thumbnail_url" => avatar.thumb.url,
      "delete_url" => picture_path(:id => id),
      "delete_type" => "DELETE" 
    }
  end
end

Соответствующий контроллер

class PicturesController < ApplicationController  

  def index
    @pictures = Picture.all
    render :json => @pictures.collect { |p| p.to_jq_upload }.to_json
  end

  def create
    @picture = Picture.new(params[:picture])
    @picture.save!
    if @picture.save
      respond_to do |format|
        format.html {  
          render :json => [@picture.to_jq_upload].to_json, 
          :content_type => 'text/html',
          :layout => false
        }
        format.json {  
          render :json => [@picture.to_jq_upload].to_json     
        }
      end
    else 
      render :json => [{:error => "custom_failure"}], :status => 304
    end
  end

  def destroy
    @picture = Picture.find(params[:id])
    @picture.destroy
    render :json => true
  end

end

Это класс загрузчика:

class AvatarUploader < CarrierWave::Uploader::Base

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end


end

person apotry    schedule 27.07.2012    source источник
comment
Просто хотел прокомментировать и сказать, что обнаружил точно такую ​​​​же функциональность. Вы когда-нибудь находили исправление?   -  person MoB    schedule 02.08.2012
comment
Я понял это сам: см. https://github.com/apotry/jquery_fileupload_carrierwave_fog для примера реализации .   -  person apotry    schedule 03.08.2012


Ответы (2)


Эта ошибка вызвана тем, что загрузчик смонтирован неправильно. Возможно опечатка в:

mount_uploader :avater, AvatarUploader

Так должно быть

mount_uploader :avatar, AvatarUploader

Попробуй это

person Barbared    schedule 27.07.2012
comment
спасибо за указание на опечатку - исправил, но сообщение об ошибке осталось прежним - person apotry; 27.07.2012

Я сам придумал решение: ошибка была в представлении, где вместо :path должно читаться :avatar, а :avatar должен быть доступен. Пример реализации, в которой также установлены параметры загрузки файлов jQuery, можно найти по адресу https://github.com/apotry/jquery_fileupload_carrierwave_fog

person apotry    schedule 03.08.2012