【问题标题】:form_tag + file_field_tag causes the controller to respond to format.html?form_tag + file_field_tag 导致控制器响应format.html?
【发布时间】:2016-10-15 07:18:30
【问题描述】:

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

问题:如果我添加 &lt;% = file_field_tag 'review [image]'%&gt; 在 index.html.erb 中,rails 抛出错误:

ActionController :: HomeController#review 中的 UnknownFormat

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

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

对不起我的英语((

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      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 
          });
      });
      

      【讨论】:

        【解决方案3】:

        我解决的问题如下:

        我的 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 而无需重新加载页面。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-11-08
          • 1970-01-01
          相关资源
          最近更新 更多