Ruby on rails 从Prototype到JQuery的更改导致了双POST
在MichaelHartl的第12章中,在用户的个人资料页面上有一个按钮,您可以翻转以跟随或取消跟随他/她。(见图12.12和12.13) 我使用的是rvm 1.8.6和Rails 3.1.1 当我使用Prototype时,单击按钮的行为正常工作。 在/sample_app/app/views/layouts/application.html.erb中Ruby on rails 从Prototype到JQuery的更改导致了双POST,ruby-on-rails,railstutorial.org,Ruby On Rails,Railstutorial.org,在MichaelHartl的第12章中,在用户的个人资料页面上有一个按钮,您可以翻转以跟随或取消跟随他/她。(见图12.12和12.13) 我使用的是rvm 1.8.6和Rails 3.1.1 当我使用Prototype时,单击按钮的行为正常工作。 在/sample_app/app/views/layouts/application.html.erb中 <%= javascript_include_tag :defaults %> 但是,在我阅读了第13章并切换到JQuery之后,
<%= javascript_include_tag :defaults %>
但是,在我阅读了第13章并切换到JQuery之后,单击follow按钮的行为导致异常并导致web服务器崩溃。
在我将/sample_app/app/views/layouts/application.html.erb修改为
<%= javascript_include_tag "application" %>
有人能帮忙吗
代码如下。
app/views/users/_follow_form.html.erb
<% unless current_user?(@user) %>
<div id="follow_form">
<% if current_user.following?(@user) %>
<%= render 'unfollow' %>
<% else %>
<%= render 'follow' %>
<% end %>
</div>
<% end %>
app/views/users/_follow.html.erb
<%= form_for current_user.relationships.build(:followed_id => @user.id),
:remote => true do |f| %>
<div><%= f.hidden_field :followed_id %></div>
<div class="actions"><%= f.submit "Follow" %></div>
<% end %>
<%= form_for current_user.relationships.find_by_followed_id(@user),
:html => { :method => :delete },
:remote => true do |f| %>
<div class="actions"><%= f.submit "Unfollow" %></div>
<% end %>
@user.id),
:remote=>true do | f |%>
app/views/users/_unfollow.html.erb
<%= form_for current_user.relationships.build(:followed_id => @user.id),
:remote => true do |f| %>
<div><%= f.hidden_field :followed_id %></div>
<div class="actions"><%= f.submit "Follow" %></div>
<% end %>
<%= form_for current_user.relationships.find_by_followed_id(@user),
:html => { :method => :delete },
:remote => true do |f| %>
<div class="actions"><%= f.submit "Unfollow" %></div>
<% end %>
{:method=>:delete},
:remote=>true do | f |%>
app/controllers/relationships_controller.rb
class RelationshipsController < ApplicationController
before_filter :authenticate
def create
@user = User.find(params[:relationship][:followed_id])
current_user.follow!(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
def destroy
@user = Relationship.find(params[:id]).followed
current_user.unfollow!(@user)
respond_to do |format|
format.html { redirect_to @user }
format.js
end
end
end
类关系控制器
app/views/relationships/create.js.erb
$("follow_form").update("<%= escape_javascript(render('users/unfollow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')
$(“遵循表单”)。更新(“”)
$(“追随者”)。更新(“”)
app/views/relationships/destroy.js.erb
$("follow_form").update("<%= escape_javascript(render('users/follow')) %>")
$("followers").update('<%= "#{@user.followers.count} followers" %>')
$(“遵循表单”)。更新(“”)
$(“追随者”)。更新(“”)
我也遇到了同样的问题,包括服务器崩溃,并设法解决了它,如下所示:
(请求确实发送了两次,可能是因为旧脚本)
-基本上删除除application.js之外的所有js文件(应由rails new for rails 3.1生成)
此外,create.js.erb需要根据原型调整为查询:
$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>")
$("#followers").html('<%= "#{@user.followers.count} followers" %>')
$(“#follow_form”).html(“”)
$(“#followers”).html(“”)
destroy.js.erb也是如此:
$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>")
$("#followers").html('<%= "#{@user.followers.count} followers" %>')
$(“#follow_form”).html(“”)
$(“#followers”).html(“”)
之后,一切都像以前一样正常。检查您的公用文件夹中是否有资产文件夹,其中包含application.js。不知道我是如何结束的,但这导致ajax查询被处理了两次 虽然我需要查看代码,但默认表单行为(submit)可能与js代码一样正在执行操作。尝试在处理表单提交的js代码的开头添加e.preventDefault。我已经添加了代码。您能告诉我在哪里可以添加e.preventDefault吗?在js事件处理程序中,函数(e){e.preventDefault();…}如果您使用的是Rails 3.1,那么您没有完全遵循使用Rails 3.0的教程。使用与本教程中不同的Rails版本可能会产生不同的结果。我建议使用教程中使用的确切gem版本。如果您渴望使用Rails 3.1,请参阅第13章。另一方面,目前正在准备一个全新的版本,该版本全部使用Rails 3.1。
$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>")
$("#followers").html('<%= "#{@user.followers.count} followers" %>')