我有两个失败的rpec测试表明有两个链接不存在。确切的消息是:
Failure/Error: it {should have_link("Sign Out", href: signout_path)}
expected #has_link?("Sign Out", {:href=>"/signout"}) to return true, got false
Failure/Error: it {should have_link("Profile", href: user_path(user))}
expected #has_link?("Profile", {:href=>"/users/1"}) to return true, got false
当我在本地访问该网站时,我注意到当我输入特定用户的网址时,页面出现但菜单更改不会像登录用户那样显示。所以我尝试以另一个用户身份登录,我注意到它不允许它告诉我我的用户信息无效。因此,这让我相信我的用户身份验证无法正常工作,但实际上我知道自从我还在学习之后知道什么。我的代码看起来像:
application_controller
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
include SessionsHelper
end
sessions_controller
class SessionsController < ApplicationController
def new
@title = "Sign In"
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email or password'
render 'new'
end
end
end
用户模型
class User < ActiveRecord::Base
before_save { self.email = email.downcase }
before_create :create_remember_token
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(?:\.[a-z\d\-]+)*\.[a-z]+\z/i
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false}
has_secure_password
validates :password, length: { minimum: 6}
def User.new_remember_token
SecureRandom.urlsafe_base64
end
def User.digest(token)
Digest::SHA1.hexdigest(token.to_s)
end
private
def create_remember_token
self.remember_token = User.digest(User.new_remember_token)
end
end
和我的sessions_helper
module SessionsHelper
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.digest(remember_token))
self.current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
remember_token = User.digest(remember_token)
@current_user ||= User.find_by(remember_token: remember_token)
end
def signed_in?
!current_user.nil?
end
end
这是用户登录时应该发生的菜单更改
<header class="navbar navbar-fixed-top navbar-inverse">
<div class="navbar-inner">
<div class="container">
<%= link_to "Sample App", root_path, class: "navbar-brand" %>
<nav>
<ul class="nav navbar-nav navbar-right">
<li><%= link_to "Home", root_path %></li>
<li><%= link_to "Help", help_path %></li>
<% if signed_in? %>
<li><%= link_to "Users", "#" %></li>
<li id="fat-menu" class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
Account
</a>
<ul class="dropdown-menu">
<li><%= link_to "Profile", current_user %></li>
<li><%= link_to "Settings", "#" %></li>
<li class="divider"></li>
<li><%= link_to "Sign Out", signout_path, method: "delete" %></li>
</ul>
</li>
<% else %>
<li><%= link_to "Sign In", signin_path %></li>
<% end %>
</ul>
</nav>
</div>
</div>
</header>
好像我的应用程序没有看到任何人登录。我可以发布需要发布的其他文件。鉴于没有出现运行时异常,我只是不确定这是如何工作的。一如既往,任何建议都表示赞赏。
这是routes.rb
Rails.application.routes.draw do
resources :users
resources :sessions, only: [:new, :create, :destroy]
root 'static_pages#home'
match '/help', to: 'static_pages#help', via: 'get'
match '/about', to: 'static_pages#about', via: 'get'
match '/contact', to: 'static_pages#contact', via: 'get'
match '/signup', to: 'users#new', via: 'get'
match '/signin', to: 'sessions#new', via: 'get'
match '/signout', to: 'sessions#destroy', via: 'delete'
答案 0 :(得分:0)
signed_in?
中的sessions_helper.rb
方法输入错误:
!current_user.nil?
应该是current_user.nil?
。
我还改变了会话控制器中的create方法:
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email or password'
render 'new'
end
end
为:
def create
user = User.find_by_email(params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email or password'
render 'new'
end
end
这些更改现在允许应用程序按预期工作。