mysql - Rails 控制台 : User will not save - Stack level too deep

标签 mysql ruby-on-rails ruby irb bcrypt-ruby

我在 Rails 控制台中遇到错误。我正在使用最新版本的 Rails 和 Pry。我正在尝试生成一个用户。我可以在用户属性中设置值,但无法保存它们。也许 User.new 在某处循环?这是我的模型的属性相关代码:

require 'bcrypt'
class User < ActiveRecord::Base

attr_accessible :first_name, :last_name, :description, :profile_photo, :password, :password_confirmation, :email
attr_reader :password

has_secure_password

validates_presence_of :email, :session_token, :first_name, :last_name, :password_digest
validates_uniqueness_of :email
validates :password, length: { minimum: 6, maximum: 20 } 

before_validation :reset_session_token!, on: :create
before_save :encrypt_new_password

这是我的用户迁移:

class CreateUsers < ActiveRecord::Migration
def change
 create_table :users do |t|
  t.string  :email, unique: true, null: false
  t.string  :password_digest, null: false
  t.string  :first_name, null: false
  t.string  :last_name, null: false
  t.string  :description, limit: 400
  t.string  :session_token, null: false
  t.attachment :profile_photo
  t.integer :profile_photo_id
  t.datetime :profile_photo_updated_at

  t.timestamps
end

  add_index :users, :email
  add_index :users, :first_name
  add_index :users, :last_name
  add_index :users, :session_token
  add_index :users, :created_at
 end
end

这是我尝试通过 User.new(values) 然后 .saveUser.create(values) 创建用户后我的 Rails 控制台错误,或 u = User.new 然后 u.value = value 然后 u.save

[10] pry(User):1> u.save
(0.2ms)  BEGIN
(0.2ms)  ROLLBACK
SystemStackError: stack level too deep
from /Users/joecase/.rvm/gems/ruby-2.1.0/gems/pry-0.9.12.6/lib/pry/pry_instance.rb:328
[11] pry(User):1> u.errors
=> #<ActiveModel::Errors:0x0000010527ccb0
@base=
#<User id: nil, email: "joecase@nyu.edu", password_digest: "111111", first_name: "Joe", last_name: "Case", description: nil, session_token: "CVnrsyyTwoOp9TZkqmVfTw", profile_photo_file_name: nil, profile_photo_content_type: nil, profile_photo_file_size: nil, profile_photo_updated_at: nil, profile_photo_id: nil, created_at: nil, updated_at: nil>,
@messages={}>

[12] pry(User):1> u.errors.full_messages
=> []

如有任何帮助,我们将不胜感激。提前谢谢你。

加密新密码:

def encrypt_new_password
  return if password.blank?
  self.hashed_password = encrypt(password)
end

重置 session token :

 def reset_session_token
   self.session_token ||= SecureRandom.urlsafe_base64(16)
   save!
 end

最佳答案

问题很可能出在回调函数 before_save :encrypt_new_password 中。

如果函数 :encrypt_new_password 尝试更新和保存用户记录,你将面临这个问题,如果你可以编辑你的问题并发布 :encrypt_new_password 那就太好了 函数,因为它是最有可能导致无限回调的函数。

查看提供的两个回调函数,问题出在验证回调函数中。

def reset_session_token
   self.session_token ||= SecureRandom.urlsafe_base64(16)
   save!
end

在你保存的验证之前,你保存的验证和在你保存的验证之前等等。因此,请尝试散列保存!调用它应该被保存,如果没有尝试使它成为一个 after_validation 回调。

关于mysql - Rails 控制台 : User will not save - Stack level too deep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21836166/

相关文章:

mysql - rails db:migrate rails 中止! Mysql2::错误:用户 'root' @'localhost' 的访问被拒绝(使用密码:是)

ruby-on-rails - 如何返回单词的状语形式

ruby - 为什么 Minitest 的 assert_raises 在这种情况下没有按预期工作?

javascript - 将类似哈希的字符串转换为哈希和安全风险

mysql - 尝试使用 EntityManager 创建 NativeQuery 时出现 IllegalStateException

php - 限制与 Laravel 的多态多对多关系中的相关记录

mysql - 在 MySQL 数据库中存储组合值 - 位屏蔽、外键、联结表或什么?

mysql - 多行插入语句包含相同的选择字段

ruby-on-rails - Rails Postgresql 多个模式和相同的表名

ruby - 字符串到哈希的转换