没有这样的列 users.remember_token
No such column users.remember_token
我尝试以非常简单的方式在我的应用程序上使用 rememberable,但是当我选中 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, source: :article, dependent: :nullify
has_many :reports, dependent: :nullify
has_many :report_articles, through: :reports, source: :article
has_many :report_comments, through: :reports, 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, presence: true, 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,你正在覆盖设计模块方法,这里是声明https://github.com/heartcombo/devise/blob/master/lib/devise/models/rememberable.rb#L147
更改属性名称应该可以解决问题。
我尝试以非常简单的方式在我的应用程序上使用 rememberable,但是当我选中 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, source: :article, dependent: :nullify
has_many :reports, dependent: :nullify
has_many :report_articles, through: :reports, source: :article
has_many :report_comments, through: :reports, 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, presence: true, 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,你正在覆盖设计模块方法,这里是声明https://github.com/heartcombo/devise/blob/master/lib/devise/models/rememberable.rb#L147
更改属性名称应该可以解决问题。