Hi guys (and gals),
I have the most strange issue that I just cannot figure out. It
doesn''t make sense at all why it''s happening, and had a fellow
Rails
developer friend of mine from the UK look at it with me last night,
and still couldn''t figure it out.
Ok, so I have a helpdesk ticketing system wrote in Rails 2.3.5. The
app itself has lots of models and controllers, respectively.
The 2 models in the app that I''m working with (well 3 considering the
mailer model), is Ticket and Customer. My mailer class is called
TicketMailer.
To make sense of it for you all, Ticket belongs_to Customer, Customer
has_many tickets. That''s the relationship between the two.
Tickets are created from the customer, so a user has to navigate to
the customer in the view and click on the create ticket, which nests
the customer_id into the ticket, which is saved to the ticket during
the create action.
With that said, I created the TicketMailer model, and what I am after,
is to deliver an e-mail to the customer when a ticket is created.
Here is my TicketMailer model:
class TicketMailer < ActionMailer::Base
def newticket(ticket)
ticket = @ticket
subject ''A new ticket has been created for you''
recipients ticket.customer.email
from
''helpdesk-7G0WDI74SAEBp02CHxDv7je48wsgrGvP@public.gmane.org''
sent_on Time.now
end
# def ticketstatus(sent_at = Time.now)
# subject ''The status of your ticket has changed''
# recipients ticket.customer.email
# from
''helpdesk-7G0WDI74SAEBp02CHxDv7je48wsgrGvP@public.gmane.org''
# sent_on sent_at
# end
end
The other method is commented out for now, as it hasn''t been
implemented, and so I will fight that battle later...
Here is the view of the e-mail, titled newticket.erb:
---------------------------------------------------------------------
Hello <%= ticket.customer.first_name %>,
A new ticket titled "<%= ticket.title %>" has been created for
you on
the Student Helpdesk Portal.
You can view your ticket at <%= link_to ticket %>.
You may submit comments on the ticket to provide questions or feedback
concerning the ticket.
As always, feel free to call us anytime at 1-866-888-3768, and we will
be happy to help.
Thank you for using the Student Helpdesk Portal, and have a great day.
Regards,
The Helpdesk Team
----------------------------------------------------------------
And here is my create action in my Tickets controller:
def create
@ticket = Ticket.new(params[:ticket])
@ticket.notes.first.user_id = current_user.id
TicketMailer.deliver_newticket(@ticket)
logger.debug("@@@ - Customer email is
#{@ticket.customer.email}")
respond_to do |format|
if @ticket.save
TicketMailer.create_newticket(@ticket)
TicketMailer.deliver_newticket(@ticket)
flash[:notice] = ''Ticket was successfully created.''
format.html { redirect_to(@ticket) }
format.xml { render :xml => @cticket, :status
=> :created, :location => @ticket }
else
format.html { render :action => "new" }
format.xml { render :xml => @ticket.errors, :status
=> :unprocessable_entity }
end
end
end
For clarification, I placed the deliver above if @ticket.save for now
to get it working, since I don''t want new tickets getting created
before the mailer is working.
The problem I am having, is when I try to create a new ticket, I get
the error:
NoMethodError (undefined method `customer'' for nil:NilClass):
app/models/ticket_mailer.rb:7:in `newticket''
app/controllers/tickets_controller.rb:84:in `create''
Which I know simply put is telling me the customer doesn''t exist,
because customer_id would be nil, so there is no association. But
there is.
Here are the params that get passed into the create action. Not the
logger.debug message I put which just reiterates that the exact
attribute I''m calling is available.
Processing TicketsController#create (for 127.0.0.1 at 2010-03-21
00:05:11) [POST]
Parameters: {"ticket"=>{"platform_id"=>"",
"title"=>"Testing
mailer", "app_version"=>"",
"app_id"=>"", "category_id"=>"5",
"user_id"=>"2", "os_version"=>"",
"status_id"=>"1", "desc"=>"Seeing if
the mailer works.", "customer_id"=>"1",
"notes_attributes"=>{"0"=>{"body"=>"Testing
mailer."}}},
"commit"=>"Create",
"action"=>"create",
"authenticity_token"=>"lFPGXK8LdqYArXPb02lvF9RSywEiK1HehoPQv7etE/c=",
"controller"=>"tickets"}
[4;36;1mUser Columns (3.4ms) [0m [0;1mSHOW FIELDS FROM
`users` [0m
[4;35;1mUser Load (0.6ms) [0m [0mSELECT * FROM `users` WHERE
(`users`.`id` = 2) LIMIT 1 [0m
[4;36;1mRole Load (1.5ms) [0m [0;1mSELECT `roles`.* FROM `roles`
INNER JOIN `assignments` ON `roles`.id = `assignments`.role_id WHERE
((`assignments`.user_id = 2)) [0m
[4;35;1mRole Columns (5.4ms) [0m [0mSHOW FIELDS FROM `roles` [0m
[4;36;1mTicket Columns (2.1ms) [0m [0;1mSHOW FIELDS FROM
`tickets` [0m
[4;35;1mNote Columns (1.9ms) [0m [0mSHOW FIELDS FROM `notes` [0m
[4;36;1mCustomer Columns (1.9ms) [0m [0;1mSHOW FIELDS FROM
`customers` [0m
[4;35;1mCustomer Load (0.4ms) [0m [0mSELECT * FROM `customers`
WHERE (`customers`.`id` = 1) [0m
@@@ - Customer email is
justin.brinkerhoff-7G0WDI74SAEBp02CHxDv7je48wsgrGvP@public.gmane.org
ActionView::TemplateError (undefined method `customer'' for
nil:NilClass) on line #1 of app/views/ticket_mailer/newticket.erb:
1: Hello <%= @ticket.customer.first_name %>,
2:
3: A new ticket titled "<%= @ticket.title %>" has been created
for you
on the Student Helpdesk Portal.
4:
app/views/ticket_mailer/newticket.erb:1
app/controllers/tickets_controller.rb:85:in `create''
Rendered rescues/_trace (141.3ms)
Rendered rescues/_request_and_response (0.7ms)
Rendering rescues/layout (internal_server_error)
[4;36;1mSQL (0.1ms) [0m [0;1mSET NAMES ''utf8'' [0m
[4;35;1mSQL (0.1ms) [0m [0mSET SQL_AUTO_IS_NULL=0 [0m
As you can see, as I put in the create action, @ticket.customer.email
displayed the value in the logger.debug message. So, the customer is
made available to the new action before hand, so the customer is
already there for the create action.
The solution has got to be something silly that I am just not seeing.
If someone could help shed some light on this for me, I''d be much
appreciative.
Thanks,
Justin
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.
On 21 March 2010 20:03, command0 <justinbrinkerhoff-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> The problem I am having, is when I try to create a new ticket, I get > the error: > > NoMethodError (undefined method `customer'' for nil:NilClass): > app/models/ticket_mailer.rb:7:in `newticket'' > app/controllers/tickets_controller.rb:84:in `create'' > > Which I know simply put is telling me the customer doesn''t exist, > because customer_id would be nil, so there is no association. But > there is.No, it''s telling you that the "ticket" variable (at line 7 of ticket_mailer.rb) is nil, and NilClass objects don''t have a "customer" method.> class TicketMailer < ActionMailer::Base > def newticket(ticket) > ticket = @ticket > subject ''A new ticket has been created for you'' > recipients ticket.customer.email > from ''helpdesk-7G0WDI74SAEBp02CHxDv7je48wsgrGvP@public.gmane.org'' > sent_on Time.now > endI''d assume the problem is caused by the assignment in the first line of the method; I''d guess it''s meant to read: @ticket = ticket ..because as it is, it doesn''t make much sense to pass in a ticket parameter and then immediately overwrite it with an instance variable. -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
LOL yeah, I was so tired when I was working on this earlier this
morning, I just totally overlooked that.
When I change the assignment, I get the "Need controller and action!"
error.
In the View, here is the whole verbage it spits out:
ActionController::RoutingError in Tickets#create
Showing app/views/ticket_mailer/newticket.erb where line #5 raised:
Need controller and action!
Here are the new params:
---------------------------
[4;35;1mSQL (0.1ms) [0m [0mSET NAMES ''utf8'' [0m
[4;36;1mSQL (0.1ms) [0m [0;1mSET SQL_AUTO_IS_NULL=0 [0m
Processing TicketsController#create (for 127.0.0.1 at 2010-03-21
14:52:09) [POST]
Parameters: {"ticket"=>{"platform_id"=>"",
"title"=>"Testing the
mailer", "app_version"=>"",
"app_id"=>"", "category_id"=>"5",
"user_id"=>"2", "os_version"=>"",
"status_id"=>"1",
"desc"=>"Let''s see
what happens.", "customer_id"=>"1",
"notes_attributes"=>{"0"=>{"body"=>"Trying
again."}}},
"commit"=>"Create",
"action"=>"create",
"authenticity_token"=>"s562boG7oXhkhgeurg4C2mKv/vrAgOg5V/zmZjibMZA=",
"controller"=>"tickets"}
[4;35;1mUser Columns (49.2ms) [0m [0mSHOW FIELDS FROM
`users` [0m
[4;36;1mUser Load (0.7ms) [0m [0;1mSELECT * FROM `users` WHERE
(`users`.`id` = 2) LIMIT 1 [0m
[4;35;1mRole Load (0.4ms) [0m [0mSELECT `roles`.* FROM `roles`
INNER JOIN `assignments` ON `roles`.id = `assignments`.role_id WHERE
((`assignments`.user_id = 2)) [0m
[4;36;1mRole Columns (1.2ms) [0m [0;1mSHOW FIELDS FROM
`roles` [0m
[4;35;1mTicket Columns (1.8ms) [0m [0mSHOW FIELDS FROM
`tickets` [0m
[4;36;1mNote Columns (1.6ms) [0m [0;1mSHOW FIELDS FROM
`notes` [0m
[4;35;1mCustomer Columns (1.6ms) [0m [0mSHOW FIELDS FROM
`customers` [0m
[4;36;1mCustomer Load (0.8ms) [0m [0;1mSELECT * FROM `customers`
WHERE (`customers`.`id` = 1) [0m
ActionView::TemplateError (Need controller and action!) on line #5 of
app/views/ticket_mailer/newticket.erb:
2:
3: A new ticket titled "<%= @ticket.title %>" has been created
for you
on the Student Helpdesk Portal.
4:
5: You can view your ticket at <%= link_to @ticket %>.
6:
7: You may submit comments on the ticket to provide questions or
feedback concerning the ticket.
8:
app/views/ticket_mailer/newticket.erb:5
app/controllers/tickets_controller.rb:84:in `create''
Rendered rescues/_trace (147.5ms)
Rendered rescues/_request_and_response (0.5ms)
Rendering rescues/layout (internal_server_error)
-------------------------------------------------
From the sounds of it, it''s a routing issue, which seems a bit odd....
On Mar 21, 2:13 pm, Michael Pavling
<pavl...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> On 21 March 2010 20:03, command0
<justinbrinkerh...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > The problem I am having, is when I try to create a new ticket, I get
> > the error:
>
> > NoMethodError (undefined method `customer'' for nil:NilClass):
> > app/models/ticket_mailer.rb:7:in `newticket''
> > app/controllers/tickets_controller.rb:84:in `create''
>
> > Which I know simply put is telling me the customer doesn''t
exist,
> > because customer_id would be nil, so there is no association. But
> > there is.
>
> No, it''s telling you that the "ticket" variable (at line
7 of
> ticket_mailer.rb) is nil, and NilClass objects don''t have a
"customer"
> method.
>
> > class TicketMailer < ActionMailer::Base
> > def newticket(ticket)
> > ticket = @ticket
> > subject ''A new ticket has been created for
you''
> > recipients ticket.customer.email
> > from
''helpd...-7G0WDI74SAEBp02CHxDv7je48wsgrGvP@public.gmane.org''
> > sent_on Time.now
> > end
>
> I''d assume the problem is caused by the assignment in the first
line
> of the method; I''d guess it''s meant to read:
> @ticket = ticket
> ..because as it is, it doesn''t make much sense to pass in a ticket
> parameter and then immediately overwrite it with an instance variable.
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk+unsubscribe@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.
On 21 March 2010 21:01, command0 <justinbrinkerhoff-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> 5: You can view your ticket at <%= link_to @ticket %>.Do you have "map_resources :tickets" in your routes.rb file? -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
I have: map.resources :tickets, :has_many => [:notes, :comments] In routes.rb. On Mar 21, 3:20 pm, Michael Pavling <pavl...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 21 March 2010 21:01, command0 <justinbrinkerh...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > 5: You can view your ticket at <%= link_to @ticket %>. > > Do you have "map_resources :tickets" in your routes.rb file?-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
On 21 March 2010 21:29, command0 <justinbrinkerhoff-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I have: > > map.resources :tickets, :has_many => [:notes, :comments] > > In routes.rb.>> > 5: You can view your ticket at <%= link_to @ticket %>.Okay, So when we get to line 5 of app/views/ticket_mailer/newticket.erb, you''re passing the @ticket variable to the link_to helper... so what''s the value of @ticket at this stage? Is it actually a "Ticket" object, or is it Nil? -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
The value of @ticket is represted as an array of all the attributes of the ticket itself. I just realized that. I had to change my link_to arguments just slightly... On Mar 21, 3:38 pm, Michael Pavling <pavl...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On 21 March 2010 21:29, command0 <justinbrinkerh...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > I have: > > > map.resources :tickets, :has_many => [:notes, :comments] > > > In routes.rb. > >> > 5: You can view your ticket at <%= link_to @ticket %>. > > Okay, > So when we get to line 5 of app/views/ticket_mailer/newticket.erb, > you''re passing the @ticket variable to the link_to helper... so what''s > the value of @ticket at this stage? Is it actually a "Ticket" object, > or is it Nil?-- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.