2

我的路线.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

我的评论.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 %>

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

ActionController :: HomeController 中的 UnknownFormat#review

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

如何更改 index.html.erb 或 home_controller.rb 中总是 rails 的操作返回 review.js 从不重新加载页面?

对不起我的英语不好 ((

4

3 回答 3

1

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

于 2016-10-15T07:25:34.290 回答
0

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

$("#send").click(function () {        
    var fd;
    fd = new FormData(document.getElementById("reviewForm"));
    $.ajax({
        url: "/home/review",
        type: "POST",
        data: fd,
        processData: false,  
        contentType: false 
    });
});
于 2016-10-15T07:31:29.043 回答
0

我解决了如下问题:

我的 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

我的评论.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,删除 ":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 %>

结果:表单(文件和文本字段)发送('post'方法)到控制器。控制器以 JSON 格式回答。回调函数收到事件“成功”并更新 html 而无需重新加载页面。

于 2016-10-17T13:15:40.057 回答