【发布时间】:2014-12-23 21:19:49
【问题描述】:
我正在尝试实施关注/取消关注表单来创建/破坏用户与网站上的公司之间的关系。我在提交表单时呈现新的部分时遇到问题,将关系按钮从“关注”更改为“取消关注”
目前,我根据关系是否已经存在来渲染不同的部分:
`<% unless current_user.id == @company.user_id %>
<div id="#relationship">
<% if current_user.following?(@company) %>
<%= render :partial => 'unfollow' %>
<% else %>
<%= render :partial => 'follow' %>
<% end %>
</div>
<% end %>`
下面的部分看起来像:
<%= form_for(current_user.relationships.build(followed_id: @company.id), remote: true) do |f| %>
<div><%= f.hidden_field :followed_id %></div>
<%= f.submit "Follow",class: "btn-transparent btn-hollow btn-huge" %>
<% end %>
虽然取消关注部分看起来像:
<%= form_for(current_user.relationships.find_by(followed_id: @company.id), html: { method: :delete }, remote: true) do |f| %>
<%= f.submit "Unfollow", class: "btn-transparent btn-hollow btn-huge" %>
<% end %>
这些使用我的Relationships_Controller 中的Create 和Destroy 方法:
class RelationshipsController < ApplicationController
before_filter :authenticate_user!
def create
@company = Company.find(params[:relationship][:followed_id])
current_user.follow!(@company)
respond_to do |format|
format.html { redirect_to @company }
format.js {render layout: false}
end
end
def destroy
@company = Relationship.find(params[:id]).followed
current_user.unfollow!(@company)
respond_to do |format|
format.html { redirect_to @company }
format.js{render layout: false}
end
end
end
如果我设置 remote: false,表单会按预期工作,创建和破坏关系,并且按钮会在页面重新加载时更改。当我尝试通过设置 remote: true 来使用 AJAX 时,并将以下代码用于关系/create.js.erb 和关系/destroy.js.erb
$("#relationship").html("<%= j render('companies/unfollow') %>");
$("#relationship").html("<%= j render('companies/follow') %>");
但是,现在当我重新加载页面时 - 我可以单击一次按钮来创建/销毁关系对象。如果我再次单击,我会收到 500 错误。永远不会加载新的部分。
虽然我有点菜鸟,但这个错误似乎指向我在 chrome 开发工具的 jquery 源代码中的这一行:
xhr.send( ( options.hasContent && options.data ) || null );
我正在使用 Rails 4、Jquery-Turbolinks 和 Devise——如果它们中的任何一个与问题有任何相关性的话。
现在非常沮丧,如果有人可以提供帮助,将不胜感激!
更新
日志输出如下。第一个 DELETE 说它已经呈现了我的部分,但它没有。第二次删除是第二次点击取消关注时发生的事情 - 它正确地指出与该 ID 号的关系不再存在,因为它在第一次操作时被删除。
Started DELETE "/relationships/429" for 127.0.0.1 at 2014-10-28 14:34:59 +0000
Processing by RelationshipsController#destroy as JS
Parameters: {"utf8"=>"✓", "commit"=>"Unfollow", "id"=>"429"}
[1m[36mUser Load (1.0ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1[0m
[1m[35mRelationship Load (0.4ms)[0m SELECT "relationships".* FROM "relationships" WHERE "relationships"."id" = $1 LIMIT 1 [["id", 429]]
[1m[36mCompany Load (0.3ms)[0m [1mSELECT "companies".* FROM "companies" WHERE "companies"."id" = $1 LIMIT 1[0m [["id", 1]]
[1m[35mRelationship Load (0.3ms)[0m SELECT "relationships".* FROM "relationships" WHERE "relationships"."follower_id" = $1 AND "relationships"."followed_id" = 1 LIMIT 1 [["follower_id", 1]]
[1m[36m (0.2ms)[0m [1mBEGIN[0m
[1m[35mSQL (3.6ms)[0m DELETE FROM "relationships" WHERE "relationships"."id" = $1 [["id", 429]]
[1m[36m (0.5ms)[0m [1mCOMMIT[0m
Rendered companies/_follow.html.erb (2.5ms)
Rendered relationships/destroy.js.erb (5.3ms)
Completed 200 OK in 19ms (Views: 7.0ms | ActiveRecord: 6.3ms)
Started DELETE "/relationships/429" for 127.0.0.1 at 2014-10-28 14:35:04 +0000
Processing by RelationshipsController#destroy as JS
Parameters: {"utf8"=>"✓", "commit"=>"Unfollow", "id"=>"429"}
[1m[35mUser Load (0.9ms)[0m SELECT "users".* FROM "users" WHERE "users"."id" = 1 ORDER BY "users"."id" ASC LIMIT 1
[1m[36mRelationship Load (0.3ms)[0m [1mSELECT "relationships".* FROM "relationships" WHERE "relationships"."id" = $1 LIMIT 1[0m [["id", 429]]
Completed 404 Not Found in 4ms
ActiveRecord::RecordNotFound - Couldn't find Relationship with 'id'=429:
【问题讨论】:
-
很高兴看到这个错误的控制台日志
-
我不知道是不是这个,但看起来你在
$("#relationship").html("<%= j (render('companies/follow') %>");中多了一个括号。如果这不是问题,控制台日志也会很棒。 -
删除了括号,但它仍然无法正常工作 - 当我尝试很多事情时它卡在了那里。现在更新了日志输出。
-
是的,在日志文件中与 id 429 的关系意味着我已经单击该按钮 429 次试图弄清楚这一点:(
标签: javascript jquery ruby-on-rails ajax