Здравствуйте, записался на курс. При этом ставил галочку на "обучаться с тьютором". На email пришло письмо, о том, что записался на самостоятельное изучение курса. Как выбрать тьютора? |
Обновление, демонстрация и удаление пользователей
Требование правильного пользователя
Конечно, требования входа пользователей недостаточно; пользователи должны иметь доступ к редактированию только своей информации. Мы можем протестировать это, вначале войдя как неправильный пользователь, а затем обратившись к edit и update действиям (Листинг 9.13). Обратите внимание: поскольку мы не используем Capybara для этих тестов (no_capybara: true), мы используем методы get и patch для обращения к действиям edit и update напрямую. К тому же, так как пользователи никогда не должны даже пытаться изменить профиль другого пользователя, мы сделаем переадресацию не на страницу входа, а на корневой URL.
require 'spec_helper' describe "Authentication" do . . . describe "authorization" do . . . describe "as wrong user" do let(:user) { FactoryGirl.create(:user) } let(:wrong_user) { FactoryGirl.create(:user, email: "wrong@example.com") } before { sign_in user, no_capybara: true } describe "submitting a GET request to the Users#edit action" do before { get edit_user_path(wrong_user) } specify { expect(response.body).not_to match(full_title('Edit user')) } specify { expect(response).to redirect_to(root_url) } end describe "submitting a PATCH request to the Users#update action" do before { patch user_path(wrong_user) } specify { expect(response).to redirect_to(root_url) } end end end endЛистинг 9.13. Тестирование того, что действия edit и update требуют правильного пользователя. spec/requests/authentication_pages_spec.rb
Обратите внимание на то, что фабрика может принимать опцию:
FactoryGirl.create(:user, email: "wrong@example.com")
Это создает пользователя с адресом электронной почты, отличающимся от дефолтного. Тесты описывают что этот пользователь не должен иметь доступа к действиям edit или update оригинального пользователя.
Код приложения добавляет второй предфильтр для вызова метода correct_user, как это показано в Листинге 9.14.
class UsersController < ApplicationController before_action :signed_in_user, only: [:edit, :update] before_action :correct_user, only: [:edit, :update] . . . def edit end def update if @user.update_attributes(user_params) flash[:success] = "Profile updated" redirect_to @user else render 'edit' end end . . . private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation) end # Before filters def signed_in_user redirect_to signin_url, notice: "Please sign in." unless signed_in? end def correct_user @user = User.find(params[:id]) redirect_to(root_url) unless current_user?(@user) end endЛистинг 9.14. Предфильтр correct_user для защиты edit/update pages. app/controllers/users_controller.rb
Фильтр correct_user использует булевый метод current_user?, который мы определили в хелпере Sessions (Листинг 9.15).
module SessionsHelper . . . def current_user remember_token = User.encrypt(cookies[:remember_token]) @current_user ||= User.find_by(remember_token: remember_token) end def current_user?(user) user == current_user end . . . endЛистинг 9.15. Метод current_user?. app/helpers/sessions_helper.rb
Листинг 9.14 также показывает обновленные edit и update действия. Ранее, в Листинге 9.2 мы имели
def edit @user = User.find(params[:id]) end
и аналогично для update. Но теперь, когда предфильтр correct_user определяет @user, мы можем опустить это для обоих действий.
Прежде чем двигаться дальше, вам следует проверить что набор тестов проходит:
$ bundle exec rspec spec/