当multipart +文件上传为true时,Ajax表单不起作用

时间:2014-01-27 05:29:48

标签: ruby-on-rails

无法完成这项工作。

我有

class QuestionsController < ApplicationController

呈现表单

<%= form_for [question, QuestionResponse.new], remote: true, :html => {:multipart => true} do |f| %>
 <%= f.text_area :text, cols: 30, rows: 8, %>
 <%= f.file_field :image, id:"file4", title: "Attach Photo" %>
 <%= f.submit "Reply", class: "btn-green" %>
<% end %>

比我有

QuestionResponsesController

 def create
    @question = #retrieve from params
    @response = @question.response.new(params[:question_response])
    @question.save!
  end

这通过javascript响应 所以我有

create.js

$("#<%= j "#{@question.id}_new_response"%>").before('<%= j render("response", response:@response)%>');

如果我没有附加文件,则可以正常使用

当我附上我的文件时,我得到了 模板缺失

Missing template question_responses/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :arb, :coffee]}. 

想到这是因为rails决定它应该响应html,然后才能解决.js响应。

我试过了:

  1. 格式:: js 添加到form_for
  2. 将respond_to:js添加到QuestionResponsesController控制器。
  3. 这不起作用它最终只是在浏览器中渲染javascript而不是执行它。

    有什么想法吗?猜它很简单。

2 个答案:

答案 0 :(得分:3)

不幸的是,通过ajax发送多部分表单没有简单而通用的方法。

但是,您可以使用其他几种方法来实现此目的:

  1. Jquery文件上传:https://github.com/blueimp/jQuery-File-Upload rails插件可在这里找到: https://github.com/tors/jquery-fileupload-rails
  2. jQuery ajaxForm:http://malsup.com/jquery/form/#file-upload
  3. 此外,您可以查看此帖子:Ruby on Rails AJAX file upload以供您参考。

    HTH:)

答案 1 :(得分:1)

我们已实施Ajax文件上传(http://video-conference-demo.herokuapp.com - 注册并尝试上传新的个人资料图片)


JQuery File Upload

我们这样做的方式是使用JQuery-File-Upload和Ajax:

#app/views/your_view.html.erb
<!-- New Avatar Upload Form -->
<%= form_for :upload, :html => {:multipart => true, :id => "avatar"}, :method => :put, url: profile_path(current_user.id), "data_id" => current_user.id do |f| %>
    <div class="btn btn-success fileinput-button avatar" id="avatar_container">
        <%= f.file_field :avatar, :title => "Upload New" %>
        <%= image_tag(@user.profile.avatar.url, :width=> '100%', :id => "avatar_img", :alt => name?(@user)) %>
    </div>
<% end %>

我们使用这个JS处理上传:

$('#avatar').fileupload({

    url: '/profile/' + $(this).attr('data_id'),
    dataType: 'json',
    type: 'post',

    add: function (e, data) {
         data.submit();
    },
    success: function (data, status) {;
         //handle data
    }
});

这是控制器代码:

def update
     @profile = User.find(current_user.id)
     @profile.profile.update(upload_params)

     respond_to do |format|
          format.html { render :nothing => true }
          format.js   { render :partial => 'profiles/update.js' }
          format.json { 
              render :json => @profile.profile.as_json(:only => [:id, :avatar], :methods => [:avatar_url])
          }
     end
end

<强>代码

我会说你的问题将与你如何保存问题有关:

QuestionResponsesController

 def create
    @question = #retrieve from params
    @response = @question.response.new(question_response_params)
    @question.save!
  end

  private

  def question_response_params
      params.require(:question_response).permit(:text, :image)
  end