我正在编写一个使用rspec进行设计和测试的rails应用程序。我有一个问题,当用户未登录时,我的rspec未通过user_authenticate。除了最后一个,我的所有规范都通过了 - 它给出的错误是
“失败/错误:get:show,id:course NoMethodError:undefined方法`authenticate'代表nil:NilClass”
我怀疑我遇到了这个问题,因为我有一个before_action:authenticate_user!呼叫,对于未登录的人,它会尝试验证nil。有没有办法让它优雅地失败并重定向到user_session?我尝试创建一个继承版本的authenticate_user来进行重定向,但它似乎不起作用。我知道这可能是一个noob问题,但我已经广泛搜索了没有任何解决方案。谢谢!
这是我的控制者:
class CoursesController < ApplicationController
before_action :authenticate_user!, except: [:index]
before_action :set_course, only: [:show]
def index
@course = Course.order('name')
end
def show
end
private
def set_course
@course = Course.find(params[:id])
end
def course_params
params.require(:course).permit(:name,:description,:department,:hidden,
:lecture_attributes => [:name,:description,:level])
end
def authenticate_user!
if user_signed_in?
super
else
redirect_to user_session
end
end
end
这是我的规范:
require 'rails_helper'
RSpec.describe CoursesController, :type => :controller do
describe "user access " do
before(:each) do
@user = create(:user)
@request.env['devise.mapping'] = Devise.mappings[:user]
sign_in :user, @user
end
describe 'GET #index' do
it 'renders the :index view' do
get :index
expect(response).to render_template :index
end
end
describe 'GET #show' do
it 'assigns the requested course to @course' do
course = create(:course)
get :show, id: course
expect(assigns(:course)).to eq course
end
it 'renders the :show template' do
course = create(:course)
get :show, id: course
expect(response).to render_template :show
end
end
end
describe "guest access " do
describe 'GET #index' do
it 'renders the :index view' do
get :index
expect(response).to render_template :index
end
end
describe 'GET #show' do
it 'redirects to the login url' do
course = create(:course)
get :show, id: course
expect(response).to redirect_to 'user_session'
end
end
end
end
答案 0 :(得分:0)
当你添加:authenticate_user时,似乎设计重定向到“users#sessions”本身!对于未登录的访客或用户的show动作。
尝试删除自定义:authenticate_user!方法并将“only:[:show]”添加到您的before_action
class CoursesController < ApplicationController
before_action :authenticate_user!, only: [:show], except: [:index]
before_action :set_course, only: [:show]
def index
@course = Course.order('name')
end
def show
end
private
def set_course
@course = Course.find(params[:id])
end
def course_params
params.require(:course).permit(:name,:description,:department,:hidden,
:lecture_attributes => [:name,:description,:level])
end
end
<强>更新强>
class CoursesController < ApplicationController
before_action :authenticate_user!, except: [:index]
before_action :set_course, only: [:show]
def index
@course = Course.order('name')
end
def show
if user_signed_in?
render :show
else
redirect_to user_session
end
end
private
def set_course
@course = Course.find(params[:id])
end
def course_params
params.require(:course).permit(:name,:description,:department,:hidden,
:lecture_attributes => [:name,:description,:level])
end
end
答案 1 :(得分:0)
这不是一个令人满意的结果,但它看起来好像是authenticate_user!没有正确使用rspec。当我直接加载页面时,它正确地重定向到登录页面,我仍然有兴趣知道正确的工作是什么。
我可以使用某种OR语句来首先检查用户是否存在吗?必须有一个标准的方法来处理这个问题,所以我可以确保我的应用程序正确重定向。