Multiple feature creation.

I have come into this late so apologies if already discussed or not relevant but any time one sees a model like this it sets alarm bells going. Generally something like this is better dealt with by user has_many wishes with one wish per record. Or maybe using something like awsome_nested_set to get the ordering.

Colin

This is my user model:

class User < ActiveRecord::Base has_one :profile has_many :games has_one :wishlist

attr_accessor :password before_save :encrypt_password

validates_presence_of :username validates_length_of :username, :within => 6..20, :message => "must contain between 6 to 20 characters" validates_uniqueness_of :username validates_presence_of :email validates_uniqueness_of :email validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on => :create validates_confirmation_of :password validates_length_of :password, :within => 8..20, :message => "must contain between 8 to 20 characters" validates_presence_of :password, :on => :create validates_presence_of :password_confirmation

before_create :assign_wishlist

private def assign_wishlist    self.wishlist = Wishlist.create end

   def encrypt_password    if password.present?      self.password_salt = BCrypt::Engine.generate_salt      self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)    end end

def self.authenticate(email, password)    user = find_by_email(email)    if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)      user    else      nil    end end end

and the following is my wishlist model:

class Wishlist < ActiveRecord::Base belongs_to :user validates_presence_of :number_1 validates_presence_of :number_2 validates_presence_of :number_3 validates_presence_of :number_4 validates_presence_of :number_5

This is your problem right here. Your validations aren't passing because nothing is being added to the wishlist in my code. Do you have these values (number_1 etc) at the moment that the user is being created? If so, where do they live at that precise moment?

Walter

Walter Davis wrote in post #1045281:

Walter Davis wrote in post #1045281:

contain between 8 to 20 characters"   def encrypt_password BCrypt::Engine.hash_secret(password, user.password_salt) class Wishlist < ActiveRecord::Base belongs_to :user validates_presence_of :number_1 validates_presence_of :number_2 validates_presence_of :number_3 validates_presence_of :number_4 validates_presence_of :number_5

This is your problem right here. Your validations aren't passing because nothing is being added to the wishlist in my code. Do you have these values (number_1 etc) at the moment that the user is being created? If so, where do they live at that precise moment?

Walter

These are in the wishlist table of the database, How would I go about making them present?

No, what I meant was, has the visitor typed them into a form field on the page? Where is the desired value coming from? Are these values present in the params hash when the form is being submitted?

If they're not there yet, and if you want the User to be created with or without a fully-populated wish list, then remove these validations and your wishlist will save as it did in my example.

Also, Colin is right, and I had written nearly the same thing but erased it because I wanted to solve one problem at a time. You really ought to be saving the individual wishlist_items as separate objects. Make another model called WishlistItem with belongs_to :wishlist, set Wishlist to has_many :wishlist_items and then you can make a nested form that will save one or many items to a wish list.

Walter

That makes total sense, how would it be able to be created if it demanded presence. I tried it without the mandatory validation and it worked.

Thanks for all the help Walter, appreciate it a lot.