Здравствуйте, записался на курс. При этом ставил галочку на "обучаться с тьютором". На email пришло письмо, о том, что записался на самостоятельное изучение курса. Как выбрать тьютора? |
Слежение за сообщениями пользователей
Страницы с читаемыми и читателями
Страницы для отображения читающих сообщения пользователя и читаемых им пользователей будут напоминать гибрид страницы профиля пользователя и страницы со списком пользователей (Раздел 9.3.1), с сайдбаром пользовательской информации (включая статистику слежения за сообщениями) и таблицу пользователей. Кроме того, мы включим сетку пользовательских профильных изображений-ссылок в сайдбаре. Набросок соответствующий этим требованиям представлен на рис. 11.14 (читаемые) и рис. 11.15 (читатели).
Нашим первым шагом будет получение рабочих ссылок following (читаемые) и followers (читатели). Мы будем следовать примеру Твиттера и обе страницы будут требовать входа пользователя, как было протестировано в Листинге 11.28. Для вошедших пользователей, страницы должны иметь ссылки на читаемых и читателей, соответственно, как протестировано в Листинге 11.29.
require 'spec_helper' describe "Authentication" do . . . describe "authorization" do describe "for non-signed-in users" do let(:user) { FactoryGirl.create(:user) } describe "in the Users controller" do . . . describe "visiting the following page" do before { visit following_user_path(user) } it { should have_title('Sign in') } end describe "visiting the followers page" do before { visit followers_user_path(user) } it { should have_title('Sign in') } end end . . . end . . . end . . . endЛистинг 11.28. Тестирование авторизации страниц читаемых и читателей. spec/requests/authentication_pages_spec.rb
require 'spec_helper' describe "User pages" do . . . describe "following/followers" do let(:user) { FactoryGirl.create(:user) } let(:other_user) { FactoryGirl.create(:user) } before { user.follow!(other_user) } describe "followed users" do before do sign_in user visit following_user_path(user) end it { should have_title(full_title('Following')) } it { should have_selector('h3', text: 'Following') } it { should have_link(other_user.name, href: user_path(other_user)) } end describe "followers" do before do sign_in other_user visit followers_user_path(other_user) end it { should have_title(full_title('Followers')) } it { should have_selector('h3', text: 'Followers') } it { should have_link(user.name, href: user_path(user)) } end end endЛистинг 11.29. Тесты для followed_users и followers страниц. spec/requests/user_pages_spec.rb
Единственно сложная часть реализации это осуществление потребности добавления двух новых действий к контроллеру Users; основанных на маршрутах, определенных в Листинге 11.18, нам нужно назвать их following и followers. Каждому действию нужно установить заголовок, найти пользователя, вытянуть @user.followed_users или @user.followers (в пагинированной форме), а затем отренедерить страницу. Результат представлен в Листинге 11.30.
class UsersController < ApplicationController before_action :signed_in_user, only: [:index, :edit, :update, :destroy, :following, :followers] . . . 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 private . . . endЛистинг 11.30. Действия following и followers. app/controllers/users_controller.rb
Отметим здесь, что оба действия делают явный вызов render, в данном случае делая рендеринг представления, названного show_follow, которое мы должны создать. Причина создания общего представления в том, что ERb является практически идентичным для обоих случаев, и Листинг 11.31 охватывает их.
<% provide(:title, @title) %> <div class="row"> <aside class="span4"> <section> <%= gravatar_for @user %> <h1><%= @user.name %></h1> <span><%= link_to "view my profile", @user %></span> <span><b>Microposts:</b> <%= @user.microposts.count %></span> </section> <section> <%= render 'shared/stats' %> <% if @users.any? %> <div class="user_avatars"> <% @users.each do |user| %> <%= link_to gravatar_for(user, size: 30), user %> <% end %> </div> <% end %> </section> </aside> <div class="span8"> <h3><%= @title %></h3> <% if @users.any? %> <ul class="users"> <%= render @users %> </ul> <%= will_paginate %> <% end %> </div> </div>Листинг 11.31. Представление show_follow используемое для рендеринга читаемых и читателей. app/views/users/show_follow.html.erb
С этим тесты должны пройти, а страницы должны выглядеть как на рис. 11.16(читаемые) и рис. 11.17(читатели).