Rails - turbolinks问题

时间:2017-06-02 19:14:12

标签: jquery ruby-on-rails turbolinks

我试图在redirect_to update_path之后启用jquery,我已经尝试过禁用turbolinks,但这并没有帮助。我目前正在成功更新一个window.location.reload()函数,但这是一个非常难看的工作。有没有更好的方法来实现这一目标?

这是在.js

    $.ajax ({
         type: 'POST',
         url: "http://localhost:3000/chess/" + sv + "/" + val,
         success: function(d){
            count = 0;
            window.location.reload();
         }

       });

这是在controller.rb中:

def move
  piece = params[:piece].chomp(",").each_char.map(&:to_i)
  a = piece[0]
  b = piece[2]

  square = params[:square].chomp(",").each_char.map(&:to_i)
  c= square[0]
  d= square[2]

  pieceVal = @@arr[a][b]
  squareVal = @@arr[c][d]

  @@arr = @@arr.each_with_index.map do | e1, i1|
    @@arr[i1].each_with_index.map do |e2, i2|
       if (i1 === a && i2 ===b)
         @@arr[a][b]  = [0]
       elsif (i1 === c && i2 === d)
        @@arr[c][d] = pieceVal
       else
        e2 = @@arr[i1][i2] 
       end
    end
  end

  redirect_to update_path



end

我尝试设置turbolinks:重定向后为false,但这只是完全禁用了jquery。

1 个答案:

答案 0 :(得分:2)

对不起这本书:我以为我会解释发生了什么,而不只是给你一个答案。

问题

所以turbolinks在这里不是问题。问题出在你的实施中(并没有那么大的问题)

当您编写redirect_to ...时,它会告诉您的浏览器转到响应标头中指定的Location。它不返回任何主体(就像GET请求返回HTML主体一样)

实施

这里的技巧是实现一些用新棋盘替换棋盘内容的方法,而无需重新加载整个页面。因为我们已经知道新棋盘的输出,我们可以用javascript做到这一点。

示例

的HTTP请求

HTTP请求(将它们视为控制器方法的结果)可以响应许多不同的格式。您已经熟悉HTML响应,这些都是标准的。还有其他格式,包括(但不限于)XHR请求(代表XML HTTP请求)和JSON请求。

Similarly to my response to a question you asked yesterday,您可以通过将以下内容添加到application_controller.rb中来看到差异(假设您还添加了其他代码):

def test
  respond_to do |format|
    format.html { render :text => "I love me some #{params[:cookies]} with my #{params[:cream]}" } 
    format.json { render :json => { :result => "I love me some #{params[:cookies]} with my #{params[:cream]}", :cookie_result => params[:cookies], :what_kind_of_cream_did_he_want => params[:cream] } 
    format.js { render :text => "alert('I love me some #{params[:cookies]} with my #{params[:cream]}');" } 
  end
end

然后在浏览器中点击localhost:3000/chocolate-chip/and/milk.json以查看生成的JSON,例如。

值得注意的是:Rails希望XHR请求(大多数情况下,ajax请求的响应)的formatjs,不要让它绊倒你。

我们无法调用localhost:3000/chocolate-chip/and/milk.xhr因为我们没有MIME类型;浏览器不知道如何处理它,我们的Rails服务器(如puma或webrick)不知道如何处理它。那很好,也很正常。

XHR请求是客户端的事情(就HTML / JS而言)。它们可以比作发送POST请求的方式:指示浏览器执行某些操作。

我们想要做的是告诉浏览器发送ajax请求。值得庆幸的是,如果您使用的是jquery_ujs(您可能就是这样,只需检查application.js文件),Rails就可以轻松实现这一目标。

要查看上面示例中生成的XHR响应,请将<%= link_to "What kind of cookies", "/chocolate-chip/and/milk", :remote => true %>放在您可以查看的现有*.html.erb文件中的某个位置。继续并单击它。它应该会返回一个警告框,大声说出我们对巧克力和牛奶的热爱。

如您所见,我们的内联javascript已执行。

解决方案

所以现在的问题是“我怎样才能让我的棋盘被这个替换?”

最佳做法是让partial _board.html.erb呈现董事会。 <div id="chess_board_wrapper"><%= render 'board' %></div>如果它位于控制器期望的相同视图路径中(根据Rails约定,您应该遵循它们)。注意:在渲染的棋盘的父元素中具有ID属性在这里很重要;我们以后会需要的。

_board.html.erb内,只需复制现有的棋盘标记。

现在,创建move.js.erb(是的,.js.erb),就像new.html.erb一样。在move.js.erb文件中,您只需编写$('#chess_board_wrapper').html('<%=j render "board" %>');

即可

然后,告诉您的move方法回复XHR请求,

def move
  # ...
  respond_to do |format|
    format.js # should automatically read move.js.erb 
    format.html { redirect_to update_path } 
  end
end

其余的都是历史。我很确定你也可以从你的ajax调用中删除success函数。