我的users / show.html.erb页面正常工作,因为每个页面上只显示一个类名。当用户在users/index.html.erb
和follow/unfollow buttons
中分页时relationship/js.create.erb
和relationship/js.destroy.erb
变得古怪,因为页面上有重复的类名称(第一个分页用户更新,无论哪个user被跟随/取消关注,这只会在页面刷新时自行修复(实际模型仍能正常工作)。)
我没有使用users/index.html.erb
中的取消关注/关注部分,因为index.html.erb中没有@user
变量,它对@users进行了分页,因此我使用了user.id
。< / p>
class RelationshipsController < ApplicationController
before_action :logged_in_user
def create
@user = User.find(params[: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
**relationships/create.js.erb**
$("#follow_form").html("<%= escape_javascript(render('users/unfollow')) %>");
$("#followers").html('<%= @user.followers.count %> <br> followers');
**relationships/destroy.js.erb**
$("#follow_form").html("<%= escape_javascript(render('users/follow')) %>");
$("#followers").html('<%= @user.followers.count %> <br> followers');
**users/index.html.erb**
<div class="row community">
<% @users.in_groups_of(3, false).each do |users| %>
<div class="col-sm-12">
<% users.each do |user| %>
<ul class="name-head">
<% unless current_user == user %>
<div id="follow_form">
<% if current_user.following?(user) %>
<%= form_for(current_user.active_relationships.find_by(followed_id: user.id),
html: { method: :delete }, remote: true) do |f| %>
<%= f.submit "Unfollow", class: "btn btn-primary" %>
<% end %>
<% else %>
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>
<div><%= hidden_field_tag :followed_id, user.id %></div>
<%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
<% end %>
</div>
<% end %>
</ul>
<div class="col-xs-12">
<div class="col-xs-4">
<a href="<%= following_user_path(user.id) %>">
<center><strong id="following" class:"stat">
<%= user.following.count %><br>
following
</strong></center>
</a>
</div>
<div class="col-xs-4">
<a href="<%= followers_user_path(user.id) %>">
<center><strong id="followers" class="stat">
<%= user.followers.count %><br>
followers
</strong></center>
</a>
</div>
<div class="col-xs-4">
<center><strong id="photo-count" class="stat">
<%= user.photos.count %><br>
photos shared
</strong></center>
</div>
</div>
</div>
<% end %>
</div>
<% end %>
</div>
<%= will_paginate %>
**users/show.html.erb**
.
.
.
<li class="follow">
<%= render 'follow_form' if logged_in? %>
</li>
</ul>
</div>
<div class="col-xs-12">
<div class="col-xs-4">
<a href="<%= following_user_path(@user) %>">
<center><strong id="following" class:"stat">
<%= @user.following.count %><br>
following
</strong></center>
</a>
</div>
<div class="col-xs-4">
<a href="<%= followers_user_path(@user) %>">
<center><strong id="followers" class="stat">
<%= @user.followers.count %><br>
followers
</strong></center>
</a>
</div>
<div class="col-xs-4">
<center><strong id="photo-count" class="stat">
<%= @user.photos.count %><br>
photos shared
</strong></center>
</div>
end
**_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 %>
**_follow.html.erb**
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>
<div><%= hidden_field_tag :followed_id, @user.id %></div>
<%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
**_unfollow.html.erb**
<%= form_for(current_user.active_relationships.find_by(followed_id: @user.id),
html: { method: :delete },
remote: true) do |f| %>
<%= f.submit "Unfollow", class: "btn btn-primary" %>
<% end %>
编辑:我考虑过将user_id传递给类,例如:
<div id="follow_form<%="#{user.id}"%>">
which created <div id="follow3">
但我不知道如何将其传递到destroy.js.erb
和create.js.erb
I have tried many combinations such as:
$("#follow_form<%="#{user.id}"%>").html("<%= escape_javascript(render('users/unfollow')) %>");
和
$("#follow_form<%= @user.id%>").html("<%= escape_javascript(render('users/unfollow')) %>");
然而,代码仍然无效,即使它确实如此,它仍然需要工作,因为更改create / destroy.js.erb文件会破坏users / show.html.erb关注/取消关注按钮。
编辑:我也发现这个question类似但不包含已接受的答案。
编辑Heroku日志:这是我在users / index.html.erb页面上关注/取消关注用户时获得的信息:
Started DELETE "/relationships/360" for 184.90.97.154 at 2016-05-13 20:05:17 +0000
Processing by RelationshipsController#destroy as JS
Rendered users/_follow.html.erb (1.6ms)
(1.1ms)[0m [1mSELECT COUNT(*) FROM "users" INNER JOIN "relationships" ON "users"."id" = "relationships"."follower_id" WHERE "relationships"."followed_id" = $1[0m [["followed_id", 1]]
Started POST "/relationships" for 184.90.97.154 at 2016-05-13 20:07:26 +0000
Processing by RelationshipsController#create as JS
[1m[36m (1.5ms)[0m [1mCOMMIT[0m
答案 0 :(得分:4)
我复制了你的代码,在添加下面的修改后,它完美地运行了。 (即我不需要为“关注/取消关注”按钮更改页面重新加载)
尝试以下操作以查看其是否有效:
users / index.html.erb (此处仅提供相关代码,即“关注/”取消关注“按钮)
<ul class="name-head">
<% unless current_user == user %>
<%= render partial: 'follow_form', locals: { user: user } %>
<% end %>
</ul>
用户/ _follow_form.html.erb
<div id="follow_form-<%= user.id %>">
<% if current_user.following?(user) %>
<%= render partial: 'unfollow', locals: { user: user } %>
<% else %>
<%= render partial: 'follow', locals: { user: user } %>
<% end %>
</div>
用户/ _unfollow.html.erb
<%= form_for(current_user.active_relationships.find_by(followed_id: user.id), html: { method: :delete }, remote: true) do |f| %>
<%= f.submit "Unfollow", class: "btn-default" %>
<% end %>
用户/ _follow.html.erb
<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>
<div><%= hidden_field_tag :followed_id, user.id %></div>
<%= f.submit "Follow", class: "btn" %>
<% end %>
关系/ create.js.erb
$("#follow_form-<%= @user.id %>").html("<%= escape_javascript(render(partial: 'users/unfollow', locals: { user: @user })) %>");
关系/ destroy.js.erb
$("#follow_form-<%= @user.id %>").html("<%= escape_javascript(render(partial: 'users/follow', locals: { user: @user })) %>");
请注意<%= render partial: "_partial.html.erb", locals: { var_name: var } %>
的使用。可选的散列locals: { ....... }
允许您将局部变量传递给要渲染的局部变量(_partial.html.erb
)在这种情况下,您还需要在局部名称之前添加partial:
你想渲染。
这样,您的user
本地变量不仅可以在users/index.html.erb
中使用,还可以在上面列出的其他文件中使用。
答案 1 :(得分:0)
问题在于您的relationship/js.create.erb
和relationship/js.destroy.erb
部分,因为您的代码只会更新您网页中的第一个#follow-form
div(首先是#follow-form
div用户,正在报告)。
您应该将users\index.html.erb
更改为
<% unless current_user == user %>
<div id="follow-form-<%= user.id %>">
这样,每个user
都会有唯一的div元素。然后,只需修改relationship/js.create.erb
,如下所示:
$("#follow-form-<%= @user.id %>").html("<%= escape_javascript(render('users/unfollow')) %>");
$("#followers").html('<%= @user.followers.count %> <br> followers');
相应地和relationship/js.destroy.erb
,那么你应该按预期工作。