1

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)から.save、またはUser.create(values)、またはu = User.newからu.value = valueからu.saveでユーザーを作成しようとした後の Rails コンソール エラーです。

[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

reset_session_token:

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

2 に答える 2

0

ほとんどの場合、問題はコールバック関数 before_save :encrypt_new_password にあります。

関数 :encrypt_new_password がユーザー レコードを更新して保存しようとすると、この問題に直面することになります。質問を編集して :encrypt_new_password 関数を投稿できれば、この関数は無限のコールバックを引き起こす可能性が最も高い関数です。

提供されているコールバック用の 2 つの関数を見ると、問題は検証用のコールバックの関数にあります。

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

検証する前に保存する検証と、保存する検証の前など。だからセーブをハッシュしてみてください!after_validation コールバックにしようとしない場合は、保存する必要があります。

于 2014-02-17T18:27:38.520 に答える
0

コールバック reset_session_token で呼び出しているという混乱があるかもしれません! しかし、感嘆符なしでメソッドを定義しましたか? しかし、他のアイデアはありません。

于 2014-02-18T12:03:43.947 に答える