Я читаю турориал "Ruby on Rails" Майкла Хартла, но я застрял здесь .
Я написал тесты для проверки авторизации пользователя при редактировании / обновлении пользователя,Я также написал код контроллера и он работает :
- Если пользователь не вошел в систему и пытается получить доступ к
users#edit
или users#update
, он перенаправляется на страницу входа - Если пользователь вошел в систему и пытается отредактировать другого пользователя, он перенаправлен в корень
Проблема в спецификации, которая проверяет пункт 2, я проверяю, что отправка запроса PUTна user_path
я перенаправлен в корень, но при запуске rspec я получаю следующую ошибку:
Failures:
1) Authentication authorization as wrong user submitting a PUT request to users#update
Failure/Error: specify { response.should redirect_to(root_url) }
Expected response to be a redirect to <http://www.example.com/> but was a redirect to <http://www.example.com/signin>
# ./spec/requests/authentication_pages_spec.rb:73:in `block (5 levels) in <top (required)>'
Кажется, он перенаправлен на signin_url
вместо root_url
, как если бы пользовательне регистрируется вообще ... и это, как мне кажется, вызывает проблему.
Приложение хранит токен в куки для аутентификации пользователя. Чтобы проверить это, я написал вспомогательный метод с именем signin_user(user)
ипоместите его в файл spec/support/utilities.rb
:
# spec/support/utilities.rb
def sign_in(user)
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
click_button "Sign in"
# Make signin work even when not using capybara (e.g. when using get, or post)
cookies[:remember_token] = user.remember_token
end
Как видите,ethod устанавливает cookie Remember_token, чтобы убедиться, что пользователь вошел в систему даже при использовании put
, delete
и т. д. ... или, по крайней мере, он должен работать!
Как я могу передать эту спецификацию так, как должна?
# spec/requests/authentication_pages_spec.rb
require 'spec_helper'
describe "Authentication" do
subject { page }
# ...
describe "authorization" do
# ...
describe "as wrong user" do
let(:user) { FactoryGirl.create(:user) }
let(:another_user) { FactoryGirl.create(:user, email: "another@example.com") }
before { sign_in(user) }
# ...
describe "submitting a PUT request to users#update" do
before { put user_path(another_user) }
specify { response.should redirect_to(root_url) }
end
end
end
end
ОБНОВЛЕНИЕ : А это мой UsersController
:
class UsersController < ApplicationController
before_filter :signed_in_user, :only => [:edit, :update]
before_filter :correct_user, :only => [:edit, :update]
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(params[:user])
if @user.save
sign_in @user
flash[:success] = "Welcome to the sample App!"
redirect_to @user
else
render "new"
end
end
def edit
end
def update
if @user.update_attributes(params[:user])
sign_in(@user)
flash[:success] = "Your profile was successfully updated"
redirect_to @user
else
render "edit"
end
end
private
def signed_in_user
unless signed_in?
redirect_to signin_url, notice: "Please sign in to access this page."
end
end
def correct_user
@user = User.find(params[:id])
redirect_to root_url unless current_user?(@user)
end
end