5

我使用了一些在 Rails 3 上运行良好但在 Rails 4 上运行良好的代码,我猜这是由 Turbolinks 引起的,但我对此了解不多,无法更深入地解决我的问题,这里是代码:

看法:

a/v/m/_new_comment.slim                                                                                                                             
.new-comment                                                                                                                                         
- if current_user
  = render "editor_toolbar"
  = form_for(Comment.new, :remote => true, :url => mission_comments_path(@mission)) do |f|
  = f.text_area :content, :class => "span10",
    :rows => "4", :tabindex => "1"
  #preview.hidden
    = "Loading..." 
  = f.submit t("missions.submit_comment"),
    "data-disable-with" => t("missions.submitting"),
    :class => "btn btn-primary", :tabindex => "2"
- else
  = render "need_login_to_comment"

控制器:

def create
  @mission = Mission.find(params[:mission_id])
  @comment = @mission.comments.build(comment_params)
  @comment.user = current_user

  if @comment.save
  @mission.events.create(user: current_user, action: "comment")
  render layout: false
end

和js:

<% if @comment.errors.any? %>                                                                                                                        
  $(".new-comment textarea").focus();
<% else %>
  $(".comments").append("<%= j (render @comment, :index => @mission.comments.count-1) %>");
  $(".new-comment #preview").addClass("hidden").html('');
  $(".new-comment textarea").css("display", "block").val('');
  $(".editor-toolbar .preview").removeClass("active");
  $(".editor-toolbar .edit").addClass("active");
<% end %>

关于这段代码我有两个问题,首先:像这样的控制器代码不起作用,js代码被传输到客户端但没有运行,我必须render layout: false在该操作的底部添加,在 Rails 3 上不需要这个

第二个问题:当我第一次访问这个页面时,重新加载页面,评论功能有效,但是如果我点击其他页面的链接跳转到这个页面,我提交这个表单会导致ajax请求多次调用,会创建多个评论

感谢广告

4

3 回答 3

16

= javascript_include_tag "application", "data-turbolinks-track" => true通过从身体到头部移动解决了这个问题,感谢您的帮助

于 2013-08-06T07:34:26.647 回答
10

你可以把它留在正文中,你只需要添加到你的脚本标签:

"data-turbolinks-eval" => false

一般来说,使用 turbolinks,最好确保您的代码是“幂等的”,因此如果它运行多次,绑定将不会设置多次。

最好的方法是先调用 unbind,而不是 $('blah').bind():

 $('blah').unbind('click').bind('click', function() {
于 2013-09-17T23:37:10.500 回答
1

您可能会遇到问题的一个可能原因是您是否在每个页面上都包含 js。我的理解是它将js附加到头部,如果你将它包含在多个页面上,你可能会发现自己多次绑定ajax。话虽如此,从我所看到的情况来看,您如何包含 js 并不明显。您可以通过仅在 application.js 中包含 js 文件来解决此问题

于 2013-08-06T05:06:46.697 回答