Forum: Ruby on Rails Foreign keys in order to send email

Posted by Christopher Jones (jimmypop01)
on 2012-03-07 14:43
Hi all,

I have a problem at the moment and am not sure what I should do. It is
in regards to relationships between tables and whether I need foreign
keys.

I have two tables in my database; users and games. Users includes all
the users information (username, email, address, password etc.) Games
includes all the games information (name, genre, console user_id). As
you may have noticed the games table includes the users id in order to
associate the relationship between the two which is every game needs an
associated user.

What I wish to do is on each games show.html.erb page, I have a button
which should send an email to the owner of that game in order to let
them now that the currently signed in user is interested in trading that
game.

I am wondering how I would do this. Does the user_id automatically link
all the users associated data or just the id. If not then how would I
declare the users email as a foreign key in order for me to call the
users email to be sent to?

Any help would be much appreciated. Thank you

Christopher Jones
Posted by Colin Law (Guest)
on 2012-03-07 14:55
(Received via mailing list)
On 7 March 2012 13:43, Christopher Jones <lists@ruby-forum.com> wrote:
> associate the relationship between the two which is every game needs an
> users email to be sent to?
Assuming you have specified user has_many games and game belongs_to
user then if you have a game you can access the game's user by
game.user, so you can access the users email by game.user.email.

Have a look at the Rails Guide on ActiveRecord Associations (and the
other guides too).  As it seems you need to learn about Rails basics I
suggest that you work right through a tutorial such as
railstutorial.org (which is free to use online).  But wait, have I not
suggested this to you on at least one previous occasion?  Have you
done that?  Am I wasting my time I wonder?

Colin
Posted by Christopher Jones (jimmypop01)
on 2012-03-07 14:58
Colin Law wrote in post #1050562:
> On 7 March 2012 13:43, Christopher Jones <lists@ruby-forum.com> wrote:
>> associate the relationship between the two which is every game needs an
>> users email to be sent to?
> Assuming you have specified user has_many games and game belongs_to
> user then if you have a game you can access the game's user by
> game.user, so you can access the users email by game.user.email.
>
> Have a look at the Rails Guide on ActiveRecord Associations (and the
> other guides too).  As it seems you need to learn about Rails basics I
> suggest that you work right through a tutorial such as
> railstutorial.org (which is free to use online).  But wait, have I not
> suggested this to you on at least one previous occasion?  Have you
> done that?  Am I wasting my time I wonder?
>
> Colin

Hey Colin I have been working through a lot of tutorials, Mainly ones
associated with the book Agile Web Development with Ruby on Rails as
well as general ones of Railstutorial.org. I am just getting used to the
whole idea of rails at the moment. It takes me a while to catch on with
programming languages.

Sorry if this is an inconvenience.

What I have understood from active record associations is that it shows 
you how to do what you have said above but the other way around so 
display the content for the has-many side as opposed to the belongs_to.

I have previous tried the method game.user.email but I get an undefined 
method 'email' error.
Posted by Christopher Jones (jimmypop01)
on 2012-03-07 15:21
I currently have the following in my games_controller for the show 
section so that when a user clicks on the button it does the following 
e.g. Jon(user 6) is interested in Adam(user 31) game. Jon clicks on 
adams game show page and clicks the interested button. The email should 
send to user 31's email address.

Now if I write game.user.email I get undefined method game but the 
following states wrong number of arguments (1 of 0).

  def show
    @game = Game.find(params[:id])

    respond_to do |format|
      GameTrade.game_interest(@game.user.email).deliver
      format.html { redirect_to root_url }
      format.json { render json: @game }
    end
  end
Posted by Colin Law (Guest)
on 2012-03-07 15:29
(Received via mailing list)
On 7 March 2012 14:21, Christopher Jones <lists@ruby-forum.com> wrote:
> I currently have the following in my games_controller for the show
> section so that when a user clicks on the button it does the following
> e.g. Jon(user 6) is interested in Adam(user 31) game. Jon clicks on
> adams game show page and clicks the interested button. The email should
> send to user 31's email address.
>
> Now if I write game.user.email I get undefined method game but the
> following states wrong number of arguments (1 of 0).

Obviously in my example I was assuming that the variable game held a
game object.

>
> def show
>  @game = Game.find(params[:id])
>
>  respond_to do |format|
>   GameTrade.game_interest(@game.user.email).deliver

If it is not obvious which method it is complaining about then split
this into a number of lines, something like
user = @game.user
email = user.email
g = GameTrade.game_interest(email)
g.deliver

and then you will see which line it fails on, assuming it is this bit
at all, but I assume you have looked at the error to see which line is
causing the problem.

Also have a look at the Rails Guide on Debugging to see how to debug 
your code.

Colin
Posted by Christopher Jones (jimmypop01)
on 2012-03-07 16:39
> If it is not obvious which method it is complaining about then split
> this into a number of lines, something like
> user = @game.user
> email = user.email
> g = GameTrade.game_interest(email)
> g.deliver
>
> and then you will see which line it fails on, assuming it is this bit
> at all, but I assume you have looked at the error to see which line is
> causing the problem.
>
> Also have a look at the Rails Guide on Debugging to see how to debug
> your code.

Hey Colin I done as you said and the debugger states the following 
error:

wrong number of arguments (1 for 0)

and then states the following:

app/mailers/game_trade.rb:9:in `game_interest'
app/controllers/games_controller.rb:19:in `block in show'
app/controllers/games_controller.rb:16:in `show'

Now the first one shouldn't be a problem, it is just the mailer as I 
have as followed which is fine:

  def game_interest
    @user = user
    mail :to => user.email, :subject => "Game Interest"
  end

But the second set of problems gives insight in to what the problem 
would be. The problem is line 19 in the controller which is the 
following line:

g = GameTrade.game_interest(email)
Posted by Colin Law (Guest)
on 2012-03-07 16:56
(Received via mailing list)
On 7 March 2012 15:39, Christopher Jones <lists@ruby-forum.com> wrote:
>>
> app/mailers/game_trade.rb:9:in `game_interest'
>
> But the second set of problems gives insight in to what the problem
> would be. The problem is line 19 in the controller which is the
> following line:
>
> g = GameTrade.game_interest(email)

So you are calling game_interest with a parameter email.  Read the
error.  It says that you are passing 1 parameter when it expects 0.
Have a look at the spec of game_interest, how many parameters does it
take?

How are you getting on with railstutorial.org?  If you worked right
through it, including the exercises and so on, then you would not have
to keep asking basic questions.

Colin
Posted by Christopher Jones (jimmypop01)
on 2012-03-07 17:08
Colin Law wrote in post #1050576:
> On 7 March 2012 15:39, Christopher Jones <lists@ruby-forum.com> wrote:
>>>
>> app/mailers/game_trade.rb:9:in `game_interest'
>>
>> But the second set of problems gives insight in to what the problem
>> would be. The problem is line 19 in the controller which is the
>> following line:
>>
>> g = GameTrade.game_interest(email)
>
> So you are calling game_interest with a parameter email.  Read the
> error.  It says that you are passing 1 parameter when it expects 0.
> Have a look at the spec of game_interest, how many parameters does it
> take?
>
> How are you getting on with railstutorial.org?  If you worked right
> through it, including the exercises and so on, then you would not have
> to keep asking basic questions.
>
> Colin

Hey Colin

What I have in my game_interest.rb is what I stated in an above post a 
few posts back.

I have only worked through the free tutorials on railstutorial.org as I 
can't afford the purchase of each episode Only managed to work through 
tutorials 1 and 8 (as they were free).
Posted by Walter Davis (walterdavis)
on 2012-03-07 17:22
(Received via mailing list)
On Mar 7, 2012, at 11:08 AM, Christopher Jones wrote:

>>
>
> Hey Colin
>
> What I have in my game_interest.rb is what I stated in an above post a
> few posts back.
>
> I have only worked through the free tutorials on railstutorial.org as I
> can't afford the purchase of each episode Only managed to work through
> tutorials 1 and 8 (as they were free).

You do realize that the entire thing is free to READ, right? The 
podcasts add flavor and show someone else doing the exercise, but the 
entire course is available for you to read and do completely FOC.

Walter
Posted by Colin Law (Guest)
on 2012-03-07 17:26
(Received via mailing list)
On 7 March 2012 16:08, Christopher Jones <lists@ruby-forum.com> wrote:
>>
>
> Hey Colin
>
> What I have in my game_interest.rb is what I stated in an above post a
> few posts back.

Please don't keep deleting the context.  It was in my reply, you have
just deleted it.  You have
def game_interest
   @user = user
   mail :to => user.email, :subject => "Game Interest"
end

How many parameters does that take?  Please answer this question.

The code that is generating the error is
g = GameTrade.game_interest(email)

How many parameters are you passing.  Please answer this question.

Is the answer to the first question the same as the answer to the 
second?

>
> I have only worked through the free tutorials on railstutorial.org as I
> can't afford the purchase of each episode Only managed to work through
> tutorials 1 and 8 (as they were free).

The whole thing is free to use online.  From
http://ruby.railstutorial.org/ click on "is available for free online"
in the second paragraph.
Now go and spend a few days working through it.

Colin
Posted by Colin Law (Guest)
on 2012-03-07 17:31
(Received via mailing list)
On 7 March 2012 16:24, Colin Law <clanlaw@googlemail.com> wrote:
>>>> g = GameTrade.game_interest(email)
>>> Colin
>  mail :to => user.email, :subject => "Game Interest"
> end
>
> How many parameters does that take? Please answer this question.
>
> The code that is generating the error is
> g = GameTrade.game_interest(email)
>
> How many parameters are you passing. Please answer this question.
>
> Is the answer to the first question the same as the answer to the second?

But actually those are not even the same method.  One is a class
method and one is an instance method.  Have you defined both?  Which
one are you trying to use?  If you do not understand the difference
between class and instance methods in ruby then do a bit of googling
into the basics of Ruby.

Colin
Posted by Christopher Jones (jimmypop01)
on 2012-03-07 17:41
Colin Law wrote in post #1050581:
> On 7 March 2012 16:08, Christopher Jones <lists@ruby-forum.com> wrote:
>>>
>>
>> Hey Colin
>>
>> What I have in my game_interest.rb is what I stated in an above post a
>> few posts back.
>
> Please don't keep deleting the context.  It was in my reply, you have
> just deleted it.  You have
> def game_interest
>    @user = user
>    mail :to => user.email, :subject => "Game Interest"
> end
>
> How many parameters does that take?  Please answer this question.
>
> The code that is generating the error is
> g = GameTrade.game_interest(email)
>
> How many parameters are you passing.  Please answer this question.
>
> Is the answer to the first question the same as the answer to the
> second?
>
>>
>> I have only worked through the free tutorials on railstutorial.org as I
>> can't afford the purchase of each episode Only managed to work through
>> tutorials 1 and 8 (as they were free).
>
> The whole thing is free to use online.  From
> http://ruby.railstutorial.org/ click on "is available for free online"
> in the second paragraph.
> Now go and spend a few days working through it.
>
> Colin

I see, that makes it a lot better, I will begin working through them 
after my lunch. Should give further insight in to some sections. A lot I 
have already covered through my book.

As an update I noticed I was not including anything after def 
game_interest in the mailer so I added (user) to the end of it which 
gives me a new error  now which is the following:

undefined method `email' for "chris230391@googlemail.com":String

This shows it is at least getting to a stage as the user who I want to 
send the email to is infact that email address.
Posted by Colin Law (Guest)
on 2012-03-07 17:47
(Received via mailing list)
On 7 March 2012 16:41, Christopher Jones <lists@ruby-forum.com> wrote:
>> just deleted it. You have
>> How many parameters are you passing. Please answer this question.
>> http://ruby.railstutorial.org/ click on "is available for free online"
> game_interest in the mailer so I added (user) to the end of it which
> gives me a new error now which is the following:
>
> undefined method `email' for "chris230391@googlemail.com":String

That says that you are trying to call method email on something that
is a string rather than a User object.

Colin
Posted by Christopher Jones (jimmypop01)
on 2012-03-08 03:06
Fixed my problem now. I changed the line:

g = GameTrade.game_interest(email)

to include user in the brackets to call the object.

All I need to do now is to put the submit_tag in to a form in order to 
get it to actually work.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.