4

In a rails project, I have 3 controllers and models, user, responsibility and profile. I have below code:

user.rb

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_one :responsibility
  has_one :profile

  before_create :build_responsibility
  before_create :build_profile

end

responsibility.rb

class Responsibility < ActiveRecord::Base

  belongs_to :user

end

profile.rb

class Profile < ActiveRecord::Base

  belongs_to :user

  validates :user_id, uniqueness: true

  validates_numericality_of :nic_code, :allow_blank => true
  validates_numericality_of :phone_number

  validates_length_of :phone_number, :minimum => 11, :maximum => 11
  validates_length_of :nic_code, :minimum => 10, :maximum => 10, :allow_blank => true

  has_attached_file :photo, :styles => { :medium => "300x300>", :thumb => "35x35>" }, :default_url => "profile-missing.jpg"
  validates_attachment_content_type :photo, :content_type => [ 'image/gif', 'image/png', 'image/x-png', 'image/jpeg', 'image/pjpeg', 'image/jpg' ]

end

Now, when I created a new user, before_create works for responsibility and creates it, but for profile it's not working and doesn't create a new profile. Is there a difference between profile and responsibility? Why before_create works for responsibility, but doesn't work for profile?

mgh
  • 921
  • 3
  • 9
  • 37

1 Answers1

5

This will almost certainly be a validation issue:

#app/models/profile.rb
validates_length_of :phone_number, :minimum => 11, :maximum => 11
validates_length_of :nic_code, :minimum => 10, :maximum => 10, :allow_blank => true

When you build an ActiveRecord object, the models will not be populated with data. This means your validations are going to have no data to validate, which I believe will throw the error

You need to test by removing the length & presence validations in your Profile model:

#app/models/profile.rb
class Profile < ActiveRecord::Base
  belongs_to :user

  # -> test without validations FOR NOW
end
Community
  • 1
  • 1
Richard Peck
  • 76,116
  • 9
  • 93
  • 147