【Rails学习笔记】用户关注功能(二)


这节主要解决关注功能的实现。 


现在用户已经有关注的人和粉丝了,我们要更新一下用户资料页面和首页,把这些变动显示出来。首先,我们要创建一个关注和取消关注的表单,然后再创建显示被关注用户列表和粉丝列表的页面。

首先我们把 following 和 folloers 动作加入 Users 控制器的路由中:

  1. SampleApp::Application.routes.draw do  
  2.   resources :users do  
  3.     member do  
  4.       get :following:followers  
  5.     end  
  6.   end  
  7.   .  
  8.   .  
  9.   .  
  10. end  

路由设置中使用的 member 方法作用是,设置这两个动作对应的 URL 地址中应该包含用户的 id。类似地,我们还可以使用 collection 方法,但 URL 中就没有用户 id 了。

上述代码生成的具名路由为:

  1. HTTP 请求 URL         动作          具名路由  
  2. GET /users/1/following  following   following_user_path(1)  
  3. GET /users/1/followers  followers   followers_user_path(1)  


然后是编写各种表单。

显示关注数量统计的局部视图
app/views/shared/_stats.html.erb

  1. <% @user ||= current_user %>  
  2. <div class="stats">  
  3.   <a href="<%= following_user_path(@user) %>">  
  4.     <strong id="following" class="stat">  
  5.       <%= @user.followed_users.count %>  
  6.     </strong>  
  7.     following  
  8.   </a>  
  9.   <a href="<%= followers_user_path(@user) %>">  
  10.     <strong id="followers" class="stat">  
  11.       <%= @user.followers.count %>  
  12.     </strong>  
  13.     followers  
  14.   </a>  
  15. </div>  

在首页中加入:

  1. <section>  
  2.         <%= render 'shared/stats' %>  
  3. </section>  

关注和取消关注表单
app/views/users/_follow_form.html.erb

  1. <% unless current_user?(@user) %>  
  2.   <div id="follow_form">  
  3.   <% if current_user.following?(@user) %>  
  4.     <%= render 'unfollow' %>  
  5.   <% else %>  
  6.     <%= render 'follow' %>  
  7.   <% end %>  
  8.   </div>  
  9. <% end %>  

添加Relationships的路由:

  1. resources :relationships, only: [:create:destroy]  

关注用户的表单和取消关注的表单:

app/views/users/_follow.html.erb  和 app/views/users/_unfollow.html.erb

  1. <%= form_for(current_user.relationships.build(followed_id: @user.id)) do |f| %>  
  2.   <div><%= f.hidden_field :followed_id %></div>  
  3.   <%= f.submit "Follow", class: "btn btn-large btn-primary" %>  
  4. <% end %>  

  1. <%= form_for(current_user.relationships.find_by(followed_id: @user),  
  2.              html: { method: :delete }) do |f| %>  
  3.   <%= f.submit "Unfollow", class: "btn btn-large" %>  
  4. <% end %>  

在用户资料show页面加入:

  1. <section>  
  2.       <%= render 'shared/stats' %>  
  3. </section>  


为了实现查看粉丝和关注人的功能,在user的控制器中实现:

  1. def following  
  2.     @title = "Following"  
  3.     @user = User.find(params[:id])  
  4.     @users = @user.followed_users.paginate(page: params[:page])  
  5.     render 'show_follow'  
  6. end  
  7.   
  8. def followers  
  9.     @title = "Followers"  
  10.     @user = User.find(params[:id])  
  11.     @users = @user.followers.paginate(page: params[:page])  
  12.     render 'show_follow'  
  13. end  

最后均转向show_follow,实现如下:

app/views/users/show_follow.html.erb

  1. <% provide(:title, @title) %>  
  2. <div class="row">  
  3.   <aside class="span4">  
  4.     <section>  
  5.       <%= gravatar_for @user %>  
  6.       <h1><%= @user.name %></h1>  
  7.       <span><%= link_to "view my profile", @user %></span>  
  8.       <span><b>Microposts:</b> <%= @user.microposts.count %></span>  
  9.     </section>  
  10.     <section>  
  11.       <%= render 'shared/stats' %>  
  12.       <% if @users.any? %>  
  13.         <div class="user_avatars">  
  14.           <% @users.each do |user| %>  
  15.             <%= link_to gravatar_for(user, size: 30), user %>  
  16.           <% end %>  
  17.         </div>  
  18.       <% end %>  
  19.     </section>  
  20.   </aside>  
  21.   <div class="span8">  
  22.     <h3><%= @title %></h3>  
  23.     <% if @users.any? %>  
  24.       <ul class="users">  
  25.         <%= render @users %>  
  26.       </ul>  
  27.       <%= will_paginate %>  
  28.     <% end %>  
  29.   </div>  
  30. </div>  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值