我试图在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。
答案 0 :(得分:2)
对不起这本书:我以为我会解释发生了什么,而不只是给你一个答案。
所以turbolinks在这里不是问题。问题出在你的实施中(并没有那么大的问题)
当您编写redirect_to ...
时,它会告诉您的浏览器转到响应标头中指定的Location
。它不返回任何主体(就像GET请求返回HTML主体一样)
这里的技巧是实现一些用新棋盘替换棋盘内容的方法,而无需重新加载整个页面。因为我们已经知道新棋盘的输出,我们可以用javascript做到这一点。
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请求的响应)的format
为js
,不要让它绊倒你。
我们无法调用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
函数。