无法在Hartl教程第8章中登录用户

时间:2014-05-27 17:23:15

标签: ruby-on-rails-4

我有两个失败的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'

1 个答案:

答案 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

这些更改现在允许应用程序按预期工作。

相关问题