2014-02-17 38 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 

在這裏,試圖通過User.new(值)創建一個用戶後是我的Rails控制檯錯誤然後.save,或User.create(值),或U = 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

我has_s out_s before_save:encrypt_new_password,我仍然收到相同的錯誤。 – user3181113

+0

我更新了答案嘗試解決方案,並希望它爲您運氣好運。 – Thresh

0

也許你在調用reset_session_token時會出現一些混淆!但定義的方法沒有excalmation標記?沒有其他想法,但。