Я бы поместил эту функциональность в функцию обратного вызова before_create
на пользовательской модели, так как она по сути является логикой модели, только не добавит еще один вызов сохранения и в целом будет более элегантной.
Одной из возможных причин, по которой ваш код не работает, является то, что @profile = Profile.create
не выполняется успешно, потому что он не проходит валидацию или что-то в этом роде. Это приведет к тому, что @profile.id
будет nil
и, следовательно, @user.default_card
будет nil
.
Вот как я бы это реализовал:
class User < ActiveRecord::Base
...
before_create :create_profile
def create_profile
profile = Profile.create
self.default_card = profile.id
# Maybe check if profile gets created and raise an error
# or provide some kind of error handling
end
end
В своем коде (или моем) вы всегда можете вставить простой puts
, чтобы проверить, создается ли новый профиль. т.е. puts (@profile = Profile.create)