Rails actionmailer sending emails for commentable model

70 Views Asked by At

I'm trying to send emails through my actionmailer to the commentable owners' email after another user writes them a comment but I keep getting an error. Can someone help me out with this? Thanks in advance.

comment_mailer.rb

def email_notification(member, comment)
    @member = commentable.member
    @sender = comment.member
    mail to: commentable.member.email, subject: "#{comment.member.full_name} (#{comment.member.user_name}) has left you a comment"
end

comment.rb

belongs_to :member
belongs_to :commentable, polymorphic: true
attr_accessible :content

after_create :send_email

def send_email
    CommentMailer.email_notification(member, comment).deliver
end

error

undefined local variable or method `comment' for #<Comment:0x51c2ad8>

app/models/comment.rb:18:in `send_email'
app/controllers/comments_controller.rb:20:in `block in create'
app/controllers/comments_controller.rb:19:in `create'

comments_controller

before_filter :authenticate_member!
before_filter :load_commentable
before_filter :find_member

def index
    redirect_to root_path
end

def new
    @comment = @commentable.comments.new
end

def create
    @comment = @commentable.comments.new(params[:comment])
    @comments = @commentable.comments.order('created_at desc').page(params[:page]).per_page(15)
    @comment.member = current_member
    respond_to do |format|
      if @comment.save
        format.html { redirect_to :back }
        format.json
        format.js
      else
        format.html { redirect_to :back }
        format.json
        format.js
      end
    end 
end

def destroy
    @comment = Comment.find(params[:id])
    respond_to do |format|
      if @comment.member == current_member || @commentable.member == current_member
        @comment.destroy
        format.html { redirect_to :back }
        format.json
        format.js
      else
       format.html { redirect_to :back, alert: 'You can\'t delete this comment.' }
       format.json
       format.js
      end
    end 
end

private

def load_commentable
    klass = [Status, Medium, Project, Event, Listing].detect { |c| params["#{c.name.underscore}_id"] }
    @commentable = klass.find(params["#{klass.name.underscore}_id"])
end

def find_member
    @member = Member.find_by_user_name(params[:user_name])
end 
1

There are 1 best solutions below

0
Mohamad On BEST ANSWER

You error is in the send_email method. There is no local variable called comment. You are already inside an instance of comment, the instance you want to send an email about. So you want to use the keyword self instead.

Change this:

def send_email
  CommentMailer.email_notification(member, comment).deliver
end

To this:

def send_email
  CommentMailer.email_notification(member, self).deliver
end

self refers to the current instance of comment, which you want to use for your mailer.