Model validations failed..(as there are two model used)

i have used two model club and user in one form but validation doesn’t
call for child model even i have written validates_associated :user in
parent model…when i fill information for user and don’t fill for club
then validations are called for club but user is saved which i don’t
want…so please help me…

Thanks,
Preksha.

Hi Preksha,

Are you using ‘.build’ parameters.

(e.g. @club = Club.new
@user = @club.users.build(params[:user]) for one(club) to many(users)
relations)

and in view page

specify <%= error_messages_for :club, :user%>

Hope this might help.

Saurabh

Saurabh P. wrote:

Hi Preksha,

Are you using ‘.build’ parameters.

(e.g. @club = Club.new
@user = @club.users.build(params[:user]) for one(club) to many(users)
relations)

and in view page

specify <%= error_messages_for :club, :user%>

Hope this might help.

Saurabh

hi Saurabh

there is one-to-one relationship between club and user…
and in club model i have used both
validates_associated :user
validates_presence_of :user_id, :message => nil
then also it is not working…

and in view page i already specified error_messages_for…

Saurabh P. wrote:

hi Saurabh

there is one-to-one relationship between club and user…
and in club model i have used both
validates_associated :user
validates_presence_of :user_id, :message => nil
then also it is not working…

and in view page i already specified error_messages_for…

Ok,

Try this,

def create
@club = Club.new(params[:club])
@user = @club.build_user(params[:user])

if @club.valid?
@club.save
end

end

hi Saurabh

but i don’t need to write @user.save any where?

This will check if both are valid or not and save them at same time, if
any one of them is invalid nothing gets saved.

Saurabh.

hi Saurabh

there is one-to-one relationship between club and user…
and in club model i have used both
validates_associated :user
validates_presence_of :user_id, :message => nil
then also it is not working…

and in view page i already specified error_messages_for…

Ok,

Try this,

def create
@club = Club.new(params[:club])
@user = @club.build_user(params[:user])

if @club.valid?
@club.save
end

end

This will check if both are valid or not and save them at same time, if
any one of them is invalid nothing gets saved.

Saurabh.

Saurabh P. wrote:

hi Saurabh

but i don’t need to write @user.save any where?

This will check if both are valid or not and save them at same time, if
any one of them is invalid nothing gets saved.

Saurabh.

Please let me know which controller are you trying to use? (Uses or
Clubs)

user controller

hi Saurabh

but i don’t need to write @user.save any where?

This will check if both are valid or not and save them at same time, if
any one of them is invalid nothing gets saved.

Saurabh.

Please let me know which controller are you trying to use? (Uses or
Clubs)

Preksha P. wrote:

Saurabh P. wrote:

hi Saurabh

but i don’t need to write @user.save any where?

This will check if both are valid or not and save them at same time, if
any one of them is invalid nothing gets saved.

Saurabh.

Please let me know which controller are you trying to use? (Uses or
Clubs)

user controller

i wrote that code in users_controoler.rb file but now validations don’t
call for any one of them.

Then try this,

in users_controllers.rb

def create
@user = User.new(params[:user])
@club = @user.build_club(params[:club])

if @user.valid?
@user.save
end

end

Note: it is not required to specify @club.save because ‘.build’ will
automatically do that for you.

in model/user.rb
validates_associated :club

Saurabh

Preksha P. wrote:

Saurabh P. wrote:

Then try this,

in users_controllers.rb

def create
@user = User.new(params[:user])
@club = @user.build_club(params[:club])

if @user.valid?
@user.save
end

end

Note: it is not required to specify @club.save because ‘.build’ will
automatically do that for you.

in model/user.rb
validates_associated :club

Saurabh

but user_id is foreign key in club table…so will it ok to write
validates_associated :club in user model?

i tried for that code but now following error occurs:
NoMethodError in UsersController#create

undefined method `build_club’ for #User:0xb5c97e70

Saurabh P. wrote:

Then try this,

in users_controllers.rb

def create
@user = User.new(params[:user])
@club = @user.build_club(params[:club])

if @user.valid?
@user.save
end

end

Note: it is not required to specify @club.save because ‘.build’ will
automatically do that for you.

in model/user.rb
validates_associated :club

Saurabh

but user_id is foreign key in club table…so will it ok to write
validates_associated :club in user model?

Can you share your model?

Saurabh P. wrote:

Can you share your model?

yeah sure…

club.rb file:

class Club < ActiveRecord::Base
belongs_to :user

belongs_to :city
belongs_to :agegroup

belongs_to :matches_type
belongs_to :role
has_many :photos, :as => :attachable
#acts_as_rateable
has_many :ratings, :as => :rateable
has_many :schedules
has_many :tournamentclubs
has_many :clubadmins
has_many :sponsor_clubs
has_many :clubheadlines
has_many :umpiers
has_many :player_profiles
has_many :scorecard

#acts_as_ferret :fields => [:name, :city_id]
#PHONE_NO_MAX_LEN = 15

validates_associated :user
#validates_presence_of :user_id, :message => nil
validates_presence_of :name
end

user.rb file:

require ‘digest/sha1’
class User < ActiveRecord::Base

Virtual attribute for the unencrypted password

attr_accessor :password
attr_accessible :login, :email, :password, :password_confirmation
validates_presence_of :login, :email
validates_presence_of :password, :if =>
:password_required?
validates_presence_of :password_confirmation, :if =>
:password_required?
validates_length_of :password, :within => 4…40, :if =>
:password_required?
validates_confirmation_of :password, :if =>
:password_required?
validates_length_of :login, :within => 3…40
validates_length_of :email, :within => 3…100
validates_uniqueness_of :login, :email, :case_sensitive => false
before_save :encrypt_password

prevents a user from submitting a crafted form that bypasses

activation

anything else you want your user to change should be added here.

#validates_associated :club
acts_as_state_machine :initial => :pending
state :passive
state :pending, :enter => :make_activation_code
state :active, :enter => :do_activate
state :suspended
state :deleted, :enter => :do_delete

event :register do
transitions :from => :passive, :to => :pending, :guard => Proc.new
{|u| !(u.crypted_password.blank? && u.password.blank?) }
end

event :activate do
transitions :from => :pending, :to => :active
end

event :suspend do
transitions :from => [:passive, :pending, :active], :to =>
:suspended
end

event :delete do
transitions :from => [:passive, :pending, :active, :suspended], :to
=> :deleted
end

event :unsuspend do
transitions :from => :suspended, :to => :active, :guard => Proc.new
{|u| !u.activated_at.blank? }
transitions :from => :suspended, :to => :pending, :guard => Proc.new
{|u| !u.activation_code.blank? }
transitions :from => :suspended, :to => :passive
end

Authenticates a user by their login name and unencrypted password.

Returns the user or nil.
def self.authenticate(login, password)
u = find_in_state :first, :active, :conditions => {:login => login}

need to get the salt

u && u.authenticated?(password) ? u : nil

end

Encrypts some data with the salt.

def self.encrypt(password, salt)
Digest::SHA1.hexdigest("–#{salt}–#{password}–")
end

Encrypts the password with the user salt

def encrypt(password)
self.class.encrypt(password, salt)
end

def authenticated?(password)
crypted_password == encrypt(password)
end

def remember_token?
remember_token_expires_at && Time.now.utc <
remember_token_expires_at
end

These create and unset the fields required for remembering users

between browser closes
def remember_me
remember_me_for 2.weeks
end

def remember_me_for(time)
remember_me_until time.from_now.utc
end

def remember_me_until(time)
self.remember_token_expires_at = time
self.remember_token =
encrypt("#{email}–#{remember_token_expires_at}")
save(false)
end

def forget_me
self.remember_token_expires_at = nil
self.remember_token = nil
save(false)
end

Returns true if the user has just been activated.

def recently_activated?
@activated
end

def forgot_password
@forgotten_password = true
self.make_password_reset_code
end

def reset_password
  # First update the password_reset_code before setting the
  # reset_password flag to avoid duplicate email notifications.
  update_attributes(:password_reset_code => nil)
  @reset_password = true
end

#used in user_observer
def recently_forgot_password?
  @forgotten_password
end

def recently_reset_password?
  @reset_password
end

def recently_activated?
  @recent_active
end

protected
def make_password_reset_code
self.password_reset_code = Digest::SHA1.hexdigest(
Time.now.to_s.split(//).sort_by {rand}.join )
end
# before filter
def encrypt_password
return if password.blank?
self.salt =
Digest::SHA1.hexdigest("–#{Time.now.to_s}–#{login}–") if new_record?
self.crypted_password = encrypt(password)
end

def password_required?
  crypted_password.blank? || !password.blank?
end

def make_activation_code
  self.deleted_at = nil
  self.activation_code = Digest::SHA1.hexdigest( 

Time.now.to_s.split(//).sort_by {rand}.join )
end

def do_delete
  self.deleted_at = Time.now.utc
end

def do_activate
  @activated = true
  self.activated_at = Time.now.utc
  self.deleted_at = self.activation_code = nil
end

end

Saurabh P. wrote:

Have you written

in user.rb

has_one :club

Saurabh

yes because there is one-to-one relationship between this two model and
user_id is foreign key in club table…

Have you written

in user.rb

has_one :club

Saurabh

Preksha P. wrote:

Saurabh P. wrote:

Have you written

in user.rb

has_one :club

Saurabh

yes because there is one-to-one relationship between this two model and
user_id is foreign key in club table…

sorry i 4got to add this line…

Preksha P. wrote:

Saurabh P. wrote:

Have you written

in user.rb

has_one :club

Saurabh

yes because there is one-to-one relationship between this two model and
user_id is foreign key in club table…

in your shared user.rb, I hadn’t seen that line hence I asked you.

Preksha P. wrote:

Preksha P. wrote:

Saurabh P. wrote:

Have you written

in user.rb

has_one :club

Saurabh

yes because there is one-to-one relationship between this two model and
user_id is foreign key in club table…

sorry i 4got to add this line…

now i wrote this code in users_controller:

@user = User.new(params[:user])
@club = @user.build_club(params[:club])

if @user.valid?
@user.save
end

and in user model this code:

has_one :club
validates_associated :club

then also validations didnt called…

Have you commented the line

in club.rb
validates_associated :user

Preksha P. wrote:

Saurabh P. wrote:

Have you commented the line

in club.rb
validates_associated :user

no i haven’t commented this line…

now i have comment out this line and add this line
validates_associated :club, :message => nil
in user.rb model