Рельсы для загрузки Ajax-файлов + Rack RawUpload + Paperclip
Я пытаюсь заставить загрузку изображений ajax работать в моем приложении rails. Я использую Paperclip для обычной загрузки изображений, и это прекрасно работает, но я не могу подключить метод ajax. Я использую Rack RawUpload и плагин File Uploader. Я следовал общим инструкциям здесь, но я застрял при фактическом прикреплении изображения к новому объекту при создании. Вот мой код контроллера:
@bottle = Bottle.new(params[:bottle])
@bottle.user_id = current_user.id
#file = params[:qqfile].is_a?(ActionDispatch::Http::UploadedFile) ? params[:qqfile] : params[:file]
is_qq = params.has_key?(:qqfile)
if is_qq
params[:bottle][:image] = params.delete(:file)
render :json => { "success" => true }
else
respond_to do |format|
if @bottle.save
format.html { redirect_to '/bottles', notice: 'Bottle was successfully created.' }
format.json { render json: @bottle, status: :created, location: @bottle }
else
format.html { render action: "new" }
format.json { render json: @bottle.errors, status: :unprocessable_entity }
end
end
end
и вот код вида:
<%= simple_form_for(@bottle, :html => { :multipart => true }) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= f.input :brand, :placeholder => 'Brand', :label => false %>
<%= f.input :region, :placeholder => 'Region', :label => false %>
<%= f.input :age, :collection => 5..35, :prompt => "Bottle Age", :label => false %>
<%= f.input :price, :placeholder => 'Price', :label => false, :as => :currency, :input_html => { :class => 'span2' } %>
<%= f.input :image_id, :as => :hidden %>
<%= f.text_area :notes, :placeholder => 'Tasting notes...', :size => "160x5" %>
</div>
</div>
<div class="span3 offset2">
Drag a file from your desktop here...
<div class="well" height="105" style="width:200px;height:300px;">
<!-- <img src="http://placehold.it/200x300" alt="" class="temp_image"> -->
<div id="file-uploader"></div>
</div>
or...
<%= f.file_field :image %>
</div>
<div class="span8 offset2">
<%= f.button :submit, :class => 'btn-primary' %>
<%= link_to bottles_path, :class => 'btn btn-danger' do %>
Cancel
<% end %>
</div>
<% end %>
Я загружаю с помощью File Uploader следующим образом:
var uploader = new qq.FileUploader({
debug: false,
/* Do not use the jQuery selector here */
element: document.getElementById("file-uploader"),
action: '/bottles',
allowedExtensions: ["jpg", "png"],
/*
* This uploads via browser memory. 1 MB example.
*/
sizeLimit: 1048576,
/* Set Article category on submit */
onSubmit: function(id, fileName) {
uploader.setParams({
authenticity_token: $("input[name='authenticity_token']").attr("value")
});
},
onComplete: function(id, fileName, responseJSON){
url = responseJSON.image.image.url;
$('.well').html('<img src="'+url+'" />');
$('input#bottle_image_id').val(responseJSON.image.id);
}
});
Кажется, что загрузка с использованием Rack нормально, и он передает параметр: file в метод, но я не могу назначить param[:bottle][:image] с помощью param[:file], я получаю ошибку:
undefined method `[]=' for nil:NilClass
Любая помощь будет принята с благодарностью.
РЕДАКТИРОВАТЬ:
Таким образом, я могу получить загрузку ajax, чтобы подключить к загрузке скрепки и добавить соответствующие параметры, но теперь мне нужно обновить этот же объект при отправке остальной части формы, а не создавать новый объект. Как я могу сохранить объект, созданный при загрузке ajax, который содержит весь контент изображения, и обновить его после отправки полной формы?
РЕДАКТИРОВАТЬ 2: ошибка, которую я получаю при сохранении
undefined method `save' for #<ActiveSupport::HashWithIndifferentAccess:0x007ff961d08e48>
Я полагаю, это потому, что я беру данные формы и пытаюсь поместить их в один и тот же объект @bottle, а хэши не совпадают.
1 ответ
Я исправляю lib/rack/request.rb на 217 строке, чтобы решить эту проблему
замещать
{}
с
@env["rack.request.form_hash"] || {}