没有这样的列users.remember_token

问题描述

我尝试以非常简单的方式在应用程序上使用“可记住”,但是当我选中“ remember_me”复选框时,出现以下错误

sqlite3::sqlException: no such column: users.remember_token: SELECT "users".* FROM "users" WHERE "users"."remember_token" = ? ORDER BY "users"."id" ASC LIMIT ?

这是我的User移民

class MigrateUserToDevise < ActiveRecord::Migration[5.2]
  def change
    change_table :users,bulk: true do |t|
      t.string :encrypted_password,null: false,default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
       t.integer  :sign_in_count,default: 0,null: false
       t.datetime :current_sign_in_at
       t.datetime :last_sign_in_at
       t.string   :current_sign_in_ip
       t.string   :last_sign_in_ip

       add_index :users,:nickname,unique: true
       add_index :users,:reset_password_token,unique: true
    end
  end
end

这是表格

<div class="login">
  <h3>로그인</h3>

  <div>
    <% flash.each do |name,msg| -%>
        <%= content_tag :div,msg,class: name %>
    <% end -%>

    <%= form_for(resource,as: resource_name,url: session_path(resource_name)) do |f| %>
      <div class="field">
        <%= f.label "ID" %><br />
        <%= f.text_field :nickname,autofocus: true,class: "input_classic" %>
      </div>

      <div class="field">
        <%= f.label "비밀번호" %><br />
        <%= f.password_field :password,autocomplete: "current-password",class: "input_classic" %>
      </div>

      <% if devise_mapping.rememberable? %>
        <div class="field">
          <%= f.check_Box :remember_me %>
          <%= f.label :remember_me %>
        </div>
      <% end %>

      <div class="actions">
        <%= f.submit "Log in" %>
      </div>
    <% end %>

    <%= render "devise/shared/links" %>
  </div>
</div>

我认为我的用户模型中不需要remember_token列,但我不明白为什么会出现此错误

谢谢

编辑:

这是我的User.rb

class User < ApplicationRecord
  devise :database_authenticatable,:registerable,:recoverable,:rememberable

  attr_accessor :remember_token,:reset_token

  has_many :favorites,dependent: :delete_all
  has_many :favorite_articles,through: :favorites,source: :article,dependent: :delete_all
  has_many :upVotes,dependent: :nullify
  has_many :upVote_articles,through: :upVotes,dependent: :nullify
  has_many :reports,dependent: :nullify
  has_many :report_articles,through: :reports,source: :article
  has_many :report_comments,source: :comment
  has_many :comments,dependent: :nullify
  has_many :articles,dependent: :nullify

  validates :nickname,uniqueness: true,presence: true,exclusion: { in: %w(admin developer modo),message: "%{value} is reserved." }
  validates :password,length: { minimum: 5 },allow_nil: true

  serialize :saved_article,Array

  # Override update_without_password
  def update_without_password(params,*options)
    if params[:password].blank?
      params.delete(:password)
      params.delete(:password_confirmation) if params[:password_confirmation].blank?
    end

    result = update_attributes(params,*options)
    clean_up_passwords
    result
  end
end

解决方法

由于您添加了Remember_token attr_accessor,所以您正在覆盖devise模块方法,这里是声明https://github.com/heartcombo/devise/blob/master/lib/devise/models/rememberable.rb#L147

更改属性名称应该可以解决问题。