2014-02-17 8 views
1

Я столкнулся с ошибкой в ​​консоли Rails. Я использую последнюю версию Rails и Pry. Я пытаюсь создать пользователя. Я могу установить значения в пользовательских атрибутах, но не могу их сохранить. Может быть, User.new где-то зацикливается? Вот атрибут-код, связанные с моей моделью:Консоль Rails: Пользователь не будет сохранять - Уровень стека слишком глубокий

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 

И вот моя Rails ошибки консоли при попытке создать пользователь с помощью User.new (значений) затем .save или User.create (значения) или и = User.new затем u.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: "[email protected]", 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 
=> [] 

ЛЮБАЯ помощь будет оценена. Заранее спасибо.

encrypt_new_password:

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

reset_session_token:

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

Как выглядит метод 'encrypt_new_password'? Если вы выполняете сохранение в этом методе, это приведет к бесконечному циклу – usha

+0

, пожалуйста, предоставьте «reset_session_token!», А также – xlembouras

+0

Обновлено для обоих. – user3181113

ответ

0

Скорее всего, проблема будет в функции обратного вызова 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.

+0

Я hashed вне before_save: encrypt_new_password, и я все еще получил ту же ошибку. – user3181113

+0

Я обновил ответ, попробовав решение и надеюсь, что это сработает для вас. – Thresh

0

Возможно, существует некоторая путаница, которую вы вызываете в обратном вызове reset_session_token! но определенный метод без знака excalmation? Однако нет другой идеи.