Rails remote form 背后做了什么

zhangsm · 2014年11月14日 · 最后由 tsaikoga 回复于 2014年12月01日 · 2545 次阅读

我很纠结这个问题,remote form 背后做了什么?

场景: topic 里面有个评论,用了remote: true

<div class="panel" style="padding: 0px;" id="new_comment">
  <% if current_user %>
    <%= form_for(resource, remote: true, url: url) do |f| %>
        <%= f.text_area :content, label: false, placeholder: '添加评论', id: 'editor' %>
        <%= f.submit "添加评论", class: 'button tiny success expand', data: { disable_with: '正在添加评论...'}, style: 'margin-bottom: 0px;' %>
      <% end %>
  <% else %>
    <p>请登录后评论</p>
  <% end %>
</div>

还有一个create.js.erb

<% if @comment.errors.empty? %>
    $('#comments-for-<%= @comment.commentable_type.downcase %>-<%= @comment.commentable_id %>').append('<%= j render @comment %>');
  $('#new_comment .simditor-body').empty();
  $('#new_comment .simditor-placeholder').show();
<% end %>

提交评论后,奇葩了:连续 post 了好几次(1 到 20 次不等),都是相同的请求:

Started POST "/topics/10/comments" for 127.0.0.1 at 2014-11-14 12:34:17 +0800
Processing by CommentsController#create as JS
  Parameters: {"utf8"=>"✓", "comment"=>{"content"=>"<p>aAfasasfdsfasdfa</p>"}, "commit"=>"添加评论", "topic_id"=>"10"}

然后数据库就莫明奇妙地多次插入这些数据,页面也多次append多条一样的评论。

临时的解决方案:就是把<%= javascript_include_tag "application", "data-turbolinks-track" => true %>放在head里面加载(之前视放在body下)

真不知道触犯了哪些教条?

类似的错误应该如何深入调试。。。。

有用 turbolinks 吗?

#1 楼 @MrPasserby 有用到,我也看了相关的文章,特别是 github 的一些 issue 都有这样的问题。

  1. application.js 里面有 jquery_ujs,负责处理 remote form。
  2. turbolinks 把网站变成单页应用,每次换页只替换 body 不替换 head,js 运行空间变成持久的。
  3. 把 application.js 放到 body,结果在每次换页都执行了一次,jquery_ujs 里面的事件就被重复绑定。

把 application.js 放到 head 不是临时方案,而是正确方案。

#3 楼 @Rei 嗯嗯,我也是看了你的博客才这样改的。为什么会连续 POST 的次数不等呢?

#4 楼 @zhangsm 点进这个页面,绑定一次,出去,进来,绑定三次,出去进来出去……,绑定次数不等。

一切尽在 jquery_ujs 里面

#7 楼 @huacnlee 嗯,刚看了一下它的源码,rails.js里面内容还蛮多的。改天要好好看一下。

学习了~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号