Я использую форму вложенной модели для регистрации и работаю через петли как новичок. Одна проблема, которая, в частности, всплыла, но которую я действительно не понимаю, это user.email
, возвращается как nil
.
Прежде чем я начал играть с вложенной формой модели, я мог создавать записи в консоли без проблем. Однако сейчас я не могу создавать записи, и некоторые из последних созданных записей имеют nil
в качестве электронной почты. (Я не уверен, имеет ли это какое-либо отношение к вложенной модели, но это мой ориентир, когда она начала выходить из строя.)
Если я зайду в rails console
, чтобы создать нового пользователя / профиль, я буду следовать этому процессу:
user = User.new
user.email = ""
user.password = ""
user.profile = Profile.new
user.profile.first_name = ""
...
user.profile.save
user.save
Все идет хорошо до user.save, который дает мне NameError: undefined local variable or method 'params' for #<User:>
. В rails console
он указывает на user.rb: 25 в create_profile
Итак, вот моя модель пользователя:
class User < ActiveRecord::Base
attr_accessor :password, :email
has_one :profile, :dependent => :destroy
accepts_nested_attributes_for :profile
validates :email, :uniqueness => true,
:length => { :within => 5..50 },
:format => { :with => /^[^@][\w.-]+@[\w.-]+[.][a-z]{2,4}$/i }
validates :password, :confirmation => true,
:length => { :within 4..20 },
:presence => true,
:if => :password_required?
before_save :encrypt_new_password
after_save :create_profile
def self.authenticate(email, password)
user = find_by_email(email)
return user if user && user.authenticated?(password)
end
def authenticated?(password)
self.hashed_password == encrypt(password
end
protected
def encrypt_new_password
return if password.blank?
self.hashed_password = encrypt(password)
end
def password_required?
hashed_password.blank? || password.present?
end
def encrypt(string)
Digest::SHA1.hexdigest(string)
end
end
Может кто-нибудь помочь мне понять, что происходит?
ОБНОВЛЕНИЕ: Я пытался изменить свое регулярное выражение, но все еще вижу ноль для электронной почты. Хотя в предыдущем посте SO говорилось, что не нужно слепо копировать регулярные выражения без тестирования, так что, возможно, я просто не протестировал его правильно. Хорошие новости: я больше не получаю сообщение об ошибке.