Hi there,
I have a User model and a Profile model. A user has_one profile, and a
profile belongs_to a user. The profile model contains a user_id column
as the foreign key.
The problem comes in when I want a user to register. In the
user_controller I have a method that creates the user. I also want the
profile model to be filled in with the appropriate user_id foreign key
(I don''t care about the other columns being filled in at that time).
Here''s what I have: (it obviously doesn''t work... but am I
close?)
def register_user
if request.get?
@user = User.new
@profile = Profile.new
else
# Get the parameters from the form and put them in the user object
@user = User.new(params[:user])
@profile = Profile.new(params[:profile])
# Storing the users IP
@user.registered_from_ip = request.remote_ip
# Set the user''s status to a default of 2
# Status 1 = Admin
# Status 2 = Member
# Status 3 = General User
@user.status = "2"
@profile.user_id = @user.id
if @user.save and @profile.save
redirect_to_index("Thank you for registering
#{@user.first_name} #{@user.last_name}")
end
end
end
The way it works now, the profiles table looks like this when a record is saved:
mysql> select * from profiles;
+----+--------+----------+---------+-------+---------+
| id | gender | homepage | country | about | user_id |
+----+--------+----------+---------+-------+---------+
| 1 | NULL | NULL | NULL | NULL | NULL |
+----+--------+----------+---------+-------+---------+
1 row in set (0.00 sec)
Are there any examples of what I want to do in the Rails Wiki?
Thank you,
Dave Hoefler
Is a profile just an instance of storing more information about the user? Or does a Profile represent a type of User? If it is the latter, then a Profile could have many Users. But I don''t think thats what you want. If it is the former, then you''re already set. Since you have ''belongs_to'' in the Profile side, and you''ve got the user_id in your profile table. When that row is created, it drops the user_id in. It looks like you that you need to refer to it as user.profile - You''ve created two seperate Items, a User and a Profile. If you created a new User called Me, then did ''Me.profile.country = "USA", and then saved, it would do what you want to do. - Nic. On 1/16/06, Dave Hoefler <dhoefler@gmail.com> wrote:> Hi there, > > I have a User model and a Profile model. A user has_one profile, and a > profile belongs_to a user. The profile model contains a user_id column > as the foreign key. > > The problem comes in when I want a user to register. In the > user_controller I have a method that creates the user. I also want the > profile model to be filled in with the appropriate user_id foreign key > (I don''t care about the other columns being filled in at that time). > Here''s what I have: (it obviously doesn''t work... but am I close?) > > def register_user > if request.get? > @user = User.new > @profile = Profile.new > else > # Get the parameters from the form and put them in the user object > @user = User.new(params[:user]) > @profile = Profile.new(params[:profile]) > # Storing the users IP > @user.registered_from_ip = request.remote_ip > > # Set the user''s status to a default of 2 > # Status 1 = Admin > # Status 2 = Member > # Status 3 = General User > @user.status = "2" > @profile.user_id = @user.id > > if @user.save and @profile.save > > redirect_to_index("Thank you for registering > #{@user.first_name} #{@user.last_name}") > end > end > end > > > The way it works now, the profiles table looks like this when a record is saved: > > mysql> select * from profiles; > +----+--------+----------+---------+-------+---------+ > | id | gender | homepage | country | about | user_id | > +----+--------+----------+---------+-------+---------+ > | 1 | NULL | NULL | NULL | NULL | NULL | > +----+--------+----------+---------+-------+---------+ > 1 row in set (0.00 sec) > > Are there any examples of what I want to do in the Rails Wiki? > > Thank you, > Dave Hoefler > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-- - Nic
Thanks Nic. That makes sense that it will automatically create the row in the profiles table when the user record is saved. However, I''m still a little lost on exactly where to place the code. It''s the syntax that messes me up. I created the new user object and a new profile object @user = User.new @profile = Profile.new When you said, "It looks like that you need to refer to it as user.profile", what exactly is "It"? Thanks, Dave Hoefler On 1/16/06, Nic Werner <nicwerner@gmail.com> wrote:> Is a profile just an instance of storing more information about the > user? Or does a Profile represent a type of User? If it is the latter, > then a Profile could have many Users. But I don''t think thats what you > want. > > If it is the former, then you''re already set. Since you have > ''belongs_to'' in the Profile side, and you''ve got the user_id in your > profile table. When that row is created, it drops the user_id in. > > It looks like you that you need to refer to it as user.profile - > You''ve created two seperate Items, a User and a Profile. If you > created a new User called Me, then did ''Me.profile.country = "USA", > and then saved, it would do what you want to do. > > - Nic. > > > On 1/16/06, Dave Hoefler <dhoefler@gmail.com> wrote: > > Hi there, > > > > I have a User model and a Profile model. A user has_one profile, and a > > profile belongs_to a user. The profile model contains a user_id column > > as the foreign key. > > > > The problem comes in when I want a user to register. In the > > user_controller I have a method that creates the user. I also want the > > profile model to be filled in with the appropriate user_id foreign key > > (I don''t care about the other columns being filled in at that time). > > Here''s what I have: (it obviously doesn''t work... but am I close?) > > > > def register_user > > if request.get? > > @user = User.new > > @profile = Profile.new > > else > > # Get the parameters from the form and put them in the user object > > @user = User.new(params[:user]) > > @profile = Profile.new(params[:profile]) > > # Storing the users IP > > @user.registered_from_ip = request.remote_ip > > > > # Set the user''s status to a default of 2 > > # Status 1 = Admin > > # Status 2 = Member > > # Status 3 = General User > > @user.status = "2" > > @profile.user_id = @user.id > > > > if @user.save and @profile.save > > > > redirect_to_index("Thank you for registering > > #{@user.first_name} #{@user.last_name}") > > end > > end > > end > > > > > > The way it works now, the profiles table looks like this when a record is saved: > > > > mysql> select * from profiles; > > +----+--------+----------+---------+-------+---------+ > > | id | gender | homepage | country | about | user_id | > > +----+--------+----------+---------+-------+---------+ > > | 1 | NULL | NULL | NULL | NULL | NULL | > > +----+--------+----------+---------+-------+---------+ > > 1 row in set (0.00 sec) > > > > Are there any examples of what I want to do in the Rails Wiki? > > > > Thank you, > > Dave Hoefler > > _______________________________________________ > > Rails mailing list > > Rails@lists.rubyonrails.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > > > > -- > - Nic > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >
Hi Dave, You''ve almost got it, you''re still thinking a little too low-level! With your two statements: @user = User.new @profile = Profile.new And adding some stuff: @user.status="Fired" @user.name="John" @profile.country="UK" Stepping aside from what you want to do in your first example, and just making RoR access Profile, the syntax is this: @user.profile = @profile See? (You''ll still need @user.save to make it go in the DB) But why create another Profile just for assignment? Just create @user, and then access the profile part like this: @user.profile.country = "UK" Quick note: Doing it backwards doesn''t save, ex: @profile.user = @user Why? Active Record only saved the objects that is assigned in the ''has_one'' category, in this instance, Profile. I didn''t think I really addressed your initial question, but more about the syntax of accessing associated objects, let me know if this helps (or confuses) - Nic. On 1/16/06, Dave Hoefler <dhoefler@gmail.com> wrote:> Thanks Nic. That makes sense that it will automatically create the row > in the profiles table when the user record is saved. However, I''m > still a little lost on exactly where to place the code. > > It''s the syntax that messes me up. > > I created the new user object and a new profile object > @user = User.new > @profile = Profile.new > > When you said, "It looks like that you need to refer to it as > user.profile", what exactly is "It"? > > Thanks, > Dave Hoefler > > On 1/16/06, Nic Werner <nicwerner@gmail.com> wrote: > > Is a profile just an instance of storing more information about the > > user? Or does a Profile represent a type of User? If it is the latter, > > then a Profile could have many Users. But I don''t think thats what you > > want. > > > > If it is the former, then you''re already set. Since you have > > ''belongs_to'' in the Profile side, and you''ve got the user_id in your > > profile table. When that row is created, it drops the user_id in. > > > > It looks like you that you need to refer to it as user.profile - > > You''ve created two seperate Items, a User and a Profile. If you > > created a new User called Me, then did ''Me.profile.country = "USA", > > and then saved, it would do what you want to do. > > > > - Nic. > > > > > > On 1/16/06, Dave Hoefler <dhoefler@gmail.com> wrote: > > > Hi there, > > > > > > I have a User model and a Profile model. A user has_one profile, and a > > > profile belongs_to a user. The profile model contains a user_id column > > > as the foreign key. > > > > > > The problem comes in when I want a user to register. In the > > > user_controller I have a method that creates the user. I also want the > > > profile model to be filled in with the appropriate user_id foreign key > > > (I don''t care about the other columns being filled in at that time). > > > Here''s what I have: (it obviously doesn''t work... but am I close?) > > > > > > def register_user > > > if request.get? > > > @user = User.new > > > @profile = Profile.new > > > else > > > # Get the parameters from the form and put them in the user object > > > @user = User.new(params[:user]) > > > @profile = Profile.new(params[:profile]) > > > # Storing the users IP > > > @user.registered_from_ip = request.remote_ip > > > > > > # Set the user''s status to a default of 2 > > > # Status 1 = Admin > > > # Status 2 = Member > > > # Status 3 = General User > > > @user.status = "2" > > > @profile.user_id = @user.id > > > > > > if @user.save and @profile.save > > > > > > redirect_to_index("Thank you for registering > > > #{@user.first_name} #{@user.last_name}") > > > end > > > end > > > end > > > > > > > > > The way it works now, the profiles table looks like this when a record is saved: > > > > > > mysql> select * from profiles; > > > +----+--------+----------+---------+-------+---------+ > > > | id | gender | homepage | country | about | user_id | > > > +----+--------+----------+---------+-------+---------+ > > > | 1 | NULL | NULL | NULL | NULL | NULL | > > > +----+--------+----------+---------+-------+---------+ > > > 1 row in set (0.00 sec) > > > > > > Are there any examples of what I want to do in the Rails Wiki? > > > > > > Thank you, > > > Dave Hoefler > > > _______________________________________________ > > > Rails mailing list > > > Rails@lists.rubyonrails.org > > > http://lists.rubyonrails.org/mailman/listinfo/rails > > > > > > > > > -- > > - Nic > > _______________________________________________ > > Rails mailing list > > Rails@lists.rubyonrails.org > > http://lists.rubyonrails.org/mailman/listinfo/rails > > > _______________________________________________ > Rails mailing list > Rails@lists.rubyonrails.org > http://lists.rubyonrails.org/mailman/listinfo/rails >-- - Nic
Hi Nic... thank you for breaking this down.
I got it to work! I previously had this:
def register_user
if request.get?
@user = User.new
@profile = Profile.new
else
# Get the parameters from the form and put them in the user object
@user = User.new(params[:user])
..... and so on....
Everytime I tried to do:
@user.profile = @profile
if @user.save
redirect_to_index("Thank you for registering
#{@user.first_name} #{@user.last_name}")
end
It wouldn''t work because @profile was nil.
I fixed it by doing this:
def register_user
if request.get?
@user = User.new
@profile = Profile.new
else
# Get the parameters from the form and put them in the user object
@user = User.new(params[:user])
@profile = Profile.new # <------ This is the line I was missing!
# Storing the users IP
@user.registered_from_ip = request.remote_ip
@user.status = "2"
@user.profile = @profile
if @user.save
redirect_to_index("Thank you for registering
#{@user.first_name} #{@user.last_name}")
end
end
end
Everything makes so much more sense. I feel like I''ve had an
enlightening moment this morning.
Thanks again Nic!
-Dave Hoefler
On 1/16/06, Nic Werner <nicwerner@gmail.com>
wrote:> Hi Dave,
> You''ve almost got it, you''re still thinking a little too
low-level!
>
> With your two statements:
>
> @user = User.new
> @profile = Profile.new
>
> And adding some stuff:
> @user.status="Fired"
> @user.name="John"
> @profile.country="UK"
>
> Stepping aside from what you want to do in your first example, and
> just making RoR access Profile, the syntax is this:
>
> @user.profile = @profile
>
> See? (You''ll still need @user.save to make it go in the DB)
>
> But why create another Profile just for assignment? Just create @user,
> and then access the profile part like this:
>
> @user.profile.country = "UK"
>
> Quick note: Doing it backwards doesn''t save, ex: @profile.user =
@user
>
> Why? Active Record only saved the objects that is assigned in the
> ''has_one'' category, in this instance, Profile.
>
> I didn''t think I really addressed your initial question, but more
> about the syntax of accessing associated objects, let me know if this
> helps (or confuses)
>
> - Nic.
>
>
> On 1/16/06, Dave Hoefler <dhoefler@gmail.com> wrote:
> > Thanks Nic. That makes sense that it will automatically create the row
> > in the profiles table when the user record is saved. However,
I''m
> > still a little lost on exactly where to place the code.
> >
> > It''s the syntax that messes me up.
> >
> > I created the new user object and a new profile object
> > @user = User.new
> > @profile = Profile.new
> >
> > When you said, "It looks like that you need to refer to it as
> > user.profile", what exactly is "It"?
> >
> > Thanks,
> > Dave Hoefler
> >
> > On 1/16/06, Nic Werner <nicwerner@gmail.com> wrote:
> > > Is a profile just an instance of storing more information about
the
> > > user? Or does a Profile represent a type of User? If it is the
latter,
> > > then a Profile could have many Users. But I don''t think
thats what you
> > > want.
> > >
> > > If it is the former, then you''re already set. Since you
have
> > > ''belongs_to'' in the Profile side, and
you''ve got the user_id in your
> > > profile table. When that row is created, it drops the user_id in.
> > >
> > > It looks like you that you need to refer to it as user.profile -
> > > You''ve created two seperate Items, a User and a Profile.
If you
> > > created a new User called Me, then did
''Me.profile.country = "USA",
> > > and then saved, it would do what you want to do.
> > >
> > > - Nic.
> > >
> > >
> > > On 1/16/06, Dave Hoefler <dhoefler@gmail.com> wrote:
> > > > Hi there,
> > > >
> > > > I have a User model and a Profile model. A user has_one
profile, and a
> > > > profile belongs_to a user. The profile model contains a
user_id column
> > > > as the foreign key.
> > > >
> > > > The problem comes in when I want a user to register. In the
> > > > user_controller I have a method that creates the user. I
also want the
> > > > profile model to be filled in with the appropriate user_id
foreign key
> > > > (I don''t care about the other columns being filled
in at that time).
> > > > Here''s what I have: (it obviously doesn''t
work... but am I close?)
> > > >
> > > > def register_user
> > > > if request.get?
> > > > @user = User.new
> > > > @profile = Profile.new
> > > > else
> > > > # Get the parameters from the form and put them in the
user object
> > > > @user = User.new(params[:user])
> > > > @profile = Profile.new(params[:profile])
> > > > # Storing the users IP
> > > > @user.registered_from_ip = request.remote_ip
> > > >
> > > > # Set the user''s status to a default of 2
> > > > # Status 1 = Admin
> > > > # Status 2 = Member
> > > > # Status 3 = General User
> > > > @user.status = "2"
> > > > @profile.user_id = @user.id
> > > >
> > > > if @user.save and @profile.save
> > > >
> > > > redirect_to_index("Thank you for registering
> > > > #{@user.first_name} #{@user.last_name}")
> > > > end
> > > > end
> > > > end
> > > >
> > > >
> > > > The way it works now, the profiles table looks like this
when a record is saved:
> > > >
> > > > mysql> select * from profiles;
> > > > +----+--------+----------+---------+-------+---------+
> > > > | id | gender | homepage | country | about | user_id |
> > > > +----+--------+----------+---------+-------+---------+
> > > > | 1 | NULL | NULL | NULL | NULL | NULL |
> > > > +----+--------+----------+---------+-------+---------+
> > > > 1 row in set (0.00 sec)
> > > >
> > > > Are there any examples of what I want to do in the Rails
Wiki?
> > > >
> > > > Thank you,
> > > > Dave Hoefler
> > > > _______________________________________________
> > > > Rails mailing list
> > > > Rails@lists.rubyonrails.org
> > > > http://lists.rubyonrails.org/mailman/listinfo/rails
> > > >
> > >
> > >
> > > --
> > > - Nic
> > > _______________________________________________
> > > Rails mailing list
> > > Rails@lists.rubyonrails.org
> > > http://lists.rubyonrails.org/mailman/listinfo/rails
> > >
> > _______________________________________________
> > Rails mailing list
> > Rails@lists.rubyonrails.org
> > http://lists.rubyonrails.org/mailman/listinfo/rails
> >
>
>
> --
> - Nic
> _______________________________________________
> Rails mailing list
> Rails@lists.rubyonrails.org
> http://lists.rubyonrails.org/mailman/listinfo/rails
>