6

本章是关于添加记住令牌以确保记住用户的登录状态,并且只有在用户明确退出时才会清除会话。我了解在我的应用程序中使用此功能的重要性,因此希望确保它正常工作。但是,当我运行时,我遇到了一堆错误

$ bundle exec rspec spec/

我怀疑它们与我的用户模型有关,因为除了一个之外,它们都包含:

NoMethodError:
       undefined method `remember_token=' for #<User:...>

最后一个包含

Failure/Error: it { should respond_to(:remember_token) }

然后指向我的 user_spec.rb、user.rb 和 authentication_pages_spec.rb 文件,我在此处包含了大部分(相关部分)。

用户.rb:

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  email      :string(255)
#  created_at :datetime        not null
#  updated_at :datetime        not null
#

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password

  before_save { |user| user.email = email.downcase }
  before_save :create_remember_token

  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence:   true,
                    format:     { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }
  validates :password_confirmation, presence: true

  private

      def create_remember_token
        self.remember_token = SecureRandom.urlsafe_base64
      end
end

authentication_pages_spec.rb:

require 'spec_helper'

describe "Authentication" do

  subject {page}
  describe "signin page" do
    before { visit signin_path }
    it {should have_selector('h1', text: 'Sign in')}
    it {should have_selector('title', text: 'Sign in')}
  end

  describe "signin" do
    before {visit signin_path}

    describe "with invalid information" do
      before {click_button "Sign in"}

      it {should have_selector('title', text: 'Sign in')}
      it {should have_selector('div.alert.alert-error', text: 'Invalid')}

      describe "after visiting another page" do
              before { click_link "Home" }
              it { should_not have_selector('div.alert.alert-error') }
            end
    end

    describe "with valid information" do
          let(:user) { FactoryGirl.create(:user) }
          before do
            fill_in "Email",    with: user.email
            fill_in "Password", with: user.password
            click_button "Sign in"
          end

          it { should have_selector('title', text: user.name) }
          it { should have_link('Profile', href: user_path(user)) }
          it { should have_link('Sign out', href: signout_path) }
          it { should_not have_link('Sign in', href: signin_path) }
          end
  end
end

和 user_spec.rb 的开头:

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  name       :string(255)
#  email      :string(255)
#  created_at :datetime        not null
#  updated_at :datetime        not null
#

require 'spec_helper'

describe User do

  before do
      @user = User.new(name: "Example User", email: "user@example.com", 
                       password: "foobar", password_confirmation: "foobar")
  end

  subject { @user }

  it { should respond_to(:name) }
  it { should respond_to(:email) }
  it { should be_valid }
  it { should respond_to(:password_digest) }
  it { should respond_to(:password) }
  it { should respond_to(:password_confirmation) }
  it { should respond_to(:authenticate) }
  it { should respond_to(:remember_token) }

  describe "remember token" do
      before { @user.save }
      its(:remember_token) { should_not be_blank }
    end
.
.
.

任何帮助将非常感激!

4

5 回答 5

4

如果您在 Heroku 上的生产中遇到此错误,请在运行后:

heroku run rake db:migrate

您需要重新启动您的应用程序:

heroku restart
于 2014-07-14T03:33:27.100 回答
2

您是否生成了将列添加到 User 模型的迁移?

$ rails generate migration add_remember_token_to_users

在此之后编辑迁移文件以添加新字段 remember_token

之后你需要做

$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare

您在模型上的注释不显示该列。确保您执行了上述命令。

于 2012-04-29T18:21:07.390 回答
2

我得到了类似的测试失败错误。我所做的是生成remember_token具有字符串类型的列。

rails generate migration add_remember_token_to_users remember_token:string --force

rake db:migrate RAILS_ENV=test

之后,测试通过。

于 2013-06-18T23:24:56.247 回答
0

我在学习 Mhartl 教程时遇到了同样的问题。我解决了。当您的数据库已经有一些用户数据时,这个问题就会出现,然后“remember_token”迁移将不起作用。您必须先清理您的日期,然后执行 db:migrate.like :

rake db:drop db:create rake db:migrate (小心:这将删除所有数据)

希望帮助

于 2014-05-07T16:41:09.130 回答
-1

我刚刚遇到了同样的问题,得到了未定义的方法 find_by_remember_token。

这是我为修复它所做的:

heroku run rake db:migrate

然后再次推送到heroku

git push heroku
于 2012-08-09T14:31:32.357 回答