Form_tag + file_field_tag导致控制器响应format.html



my routes.rb:

post 'home/review'
我home_conrtoller.rb

:

def review
  @review = Review.new(review_params)
  @review.image = params[:review][:image]
  if @review.save
    respond_to do |format|
      format.js   { render 'review', locals: {review_name: @review.review_name, review_body: @review.review_body} }
    end
  else
    format.html { respond_to root_path}
  end
end
private
def review_params
  params.require(:review).permit(:review_name, :review_body, :image)
end
我review.js

:

$(function() {
  var theHTML = [];
  theHTML.push('somewhat');
 $(".wrap-body").append(theHTML.join(''));
});
我index.html.erb

<%= form_tag home_review_path, :method => 'post', :multipart => true,  :remote => true do %>
  <%= text_area_tag  'review[review_body]'%>
  <%= text_field_tag 'review[review_name]'%>
  <%= file_field_tag 'review[image]' %>   <==== problem !!!
  <%= submit_tag 'Send'%>
<%end %>

问题:如果我加上索引。html中的<% = file_field_tag 'review [image]'%>。Erb, rails抛出错误:

ActionController:: UnknownFormat in HomeController#review

但是如果字段<% = file_field_tag 'review [image]'%>在index.html.erb中没有返回review.js !!

如何修改home_controller中的index.html.erb或action。总是rails返回一个review.js从不重新加载页面?

对不起我的英语(

可能不是您的直接解决方案,但我建议使用Remotipart gem,它仅用于使用remote: true形式的ajax文件上传,因为当使用remote形式的文件上传时,rails回落到HTML提交。PS:我不确定我完全得到了你的问题,这可能不是确切问题的解决方案。

您无法使用远程true选项提交文件,您可以尝试以下操作

$("#send").click(function () {        
    var fd;
    fd = new FormData(document.getElementById("reviewForm"));
    $.ajax({
        url: "/home/review",
        type: "POST",
        data: fd,
        processData: false,  
        contentType: false 
    });
});

我是这样解决这个问题的:

我home_conrtoller.rb

:

def review
  @review = Review.new(review_params)
  if @review.save
    render json: {review_name: @review.review_name, review_body: @review.review_body, review_image: @review.image.url}
  else
    respond_to root_path
  end
private       
def review_params
    params.require(:review).permit(:review_name, :review_body, :image)
  end    
end
我review.js

$(function() {
  "use strict"; // Start of use strict
  $('#form_review').ajaxForm({
      success: SubmitSuccesful
  });
});
function SubmitSuccesful(responseText) {
  var theHTML = [];
  theHTML.push('<img src="'+ responseText.review_image+'">');
  $(".wrap-body").append(theHTML.join(''));
}

和我的index.html。动词,delete ":remote => true"

<%= form_tag home_review_path, :method => 'post', :multipart => true do %>
  <%= text_area_tag  'review[review_body]'%>
  <%= text_field_tag 'review[review_name]'%>
  <%= file_field_tag 'review[image]' %> 
  <%= submit_tag 'Send'%>
<%end %>

result: form (file and text_fields) send ('post' method) to controller控制器回答JSON格式。

回调函数收到事件"success"并更新html而不重新加载页面。

最新更新