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

时间:2016-10-15 07:18:30

标签: ruby-on-rails forms respond-to

my routes.rb:

post 'home/review'

my 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

my 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 %>

问题:如果我添加 index.html.erb中的<% = file_field_tag 'review [image]'%>,rails会抛出错误:

  HomeController#review

中的ActionController :: UnknownFormat

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

如何更改home_controller.rb中始终为rails返回review.js的index.html.erb或action,从不重新加载页面?

对不起我的英语((

3 个答案:

答案 0 :(得分:1)

也许不是直接的解决方案,但我建议使用Remotipart gem,它仅用于使用remote: true表单在rails中上传ajax文件,因为在remote中使用文件上传时form,rails回退到HTML提交。  PS:我不确定我是否完全解决了你的问题,这可能不是确切问题的解决方案。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我解决了以下问题:

my 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

my 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.erb,删除&#34;:remote =&gt;真&#34;

<%= 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 %>

结果:form(file和text_fields)向控制器发送(&#39; post&#39;方法)。控制器以JSON格式回答。回调函数收到事件&#34;成功&#34;并在没有重新加载页面的情况下更新html。