这节主要解决关注功能的实现。
现在用户已经有关注的人和粉丝了,我们要更新一下用户资料页面和首页,把这些变动显示出来。首先,我们要创建一个关注和取消关注的表单,然后再创建显示被关注用户列表和粉丝列表的页面。
首先我们把 following 和 folloers 动作加入 Users 控制器的路由中:
SampleApp::Application.routes.draw do
resources :users do
member do
get :following, :followers
end
end
.
.
.
end
上述代码生成的具名路由为:
HTTP 请求 URL 动作 具名路由
GET /users/1/following following following_user_path(1)
GET /users/1/followers followers followers_user_path(1)
然后是编写各种表单。
显示关注数量统计的局部视图
app/views/shared/_stats.html.erb
<% @user ||= current_user %>
<%= render 'shared/stats' %>
<% unless current_user?(@user) %>
<% if current_user.following?(@user) %>
<%= render 'unfollow' %>
<% else %>
<%= render 'follow' %>
<% end %>
<% end %>
resources :relationships, only: [:create, :destroy]
app/views/users/_follow.html.erb 和 app/views/users/_unfollow.html.erb
<%= form_for(current_user.relationships.build(followed_id: @user.id)) do |f| %>
<%= f.hidden_field :followed_id %>
<%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>
<%= form_for(current_user.relationships.find_by(followed_id: @user),
html: { method: :delete }) do |f| %>
<%= f.submit "Unfollow", class: "btn btn-large" %>
<% end %>
<%= render 'shared/stats' %>
为了实现查看粉丝和关注人的功能,在user的控制器中实现:
def following
@title = "Following"
@user = User.find(params[:id])
@users = @user.followed_users.paginate(page: params[:page])
render 'show_follow'
end
def followers
@title = "Followers"
@user = User.find(params[:id])
@users = @user.followers.paginate(page: params[:page])
render 'show_follow'
end
app/views/users/show_follow.html.erb
<% provide(:title, @title) %>
<%= @title %>
<% if @users.any? %>
<%= render @users %>
<%= will_paginate %>
<% end %>