2016-04-27 12 views
1

Es ist mein erster Versuch, den Rails Mailer zum Senden von E-Mails zu verwenden. Ich bin jedoch in der Lage, einfache E-Mails zu senden, aber wenn ich versuchte, den angemeldeten Benutzer (current_user) Namen und Parameter Werte über das Formular senden, bekomme ich den Fehler. Nicht definierte Methode 'params'.Rails mailer view template pass pass Wert durch ein Formular senden

payment_mailer.rb

class PaymentMailer < ApplicationMailer 
    def success(user) 
     mail(to: "#{user.first_name} #{user.last_name} <#{user.email}>", subject: "Payment Successful") 
    end 
end 

success.html.erb

<div class = "col-sm-12"> 
      <h1>Payment Successful</h1> 
      <p>Dear <%= user.first_name %>, Thank you for being a part of our system<br> 
      Your invoice (#<%= params[:id] %>) has been generated. 
      </p> 
     </div> 
     <div class = "clearfix"></div> 
     <div class = "col-sm-6"> 
      <table class = "table"> 
      <thead> 
       <tr> 
       <th>Paid Ammount</th> 
       <th>Card Transaction Fee (2.9% + 0.30)</th> 
       <th>Credited Ammount</th> 
       </tr> 
      </thead> 
      <tbody> 
       <tr> 
       <td>&euro;<%= params[:amount] %></td> 
       <td></td> 
       <td></td> 
       </tr> 
      </tbody> 
      <h3>Total credited amount in your Account is: </h3> 
      </table> 
     </div> 
     <div class = "clearfix"></div> 
     </div> 

payment_controller.rb

amount = params[:amount] 
@user = current_user 
netamt = (amount.to_f - ((amount.to_f*2.9)/100 + 0.30)) 
payment = @user.payments.create(:amount => netamt, :method => "Card", :txn_code => params[:stripeToken]) 
@user.update_attribute(:balance, @user.balance+netamt) 
PaymentMailer.success(current_user).deliver_now 

Bitte leite mich.

+0

'params verwenden 'ist nicht im Erfolgsmailer verfügbar. Sie können die "ID" und "Menge" aus Ihren Benutzer-Tabellenrelationen erhalten –

+0

Wenn Sie die ID des Benutzers benötigen, dann verwenden Sie statt params [: id] user.id. Und wenn Sie ID von einer anderen Tabelle benötigen, übergeben Sie es in Parametern wie Sie bestanden current_user – Arif

+0

Ich möchte die ID der Zahlungstabelle verwenden und tun user.first_name auch Fehler generiert. –

Antwort

0

Ändern Sie einfach in Ihrer Zahlung Controller nach der Zahlung, zu tun wie die

PaymentMailer.success(payment).deliver_now 

Und in Ihrem Mailer tun

class PaymentMailer < ApplicationMailer 
    def success(payment) 
    @payment = payment 
    @user = payment.user 
    mail(to: "#{@user.first_name} #{@user.last_name} <#{@user.email}>", subject: "Payment Successful") 
    end 
end 

und in Ihrem Mailer Vorlage

@payment.id #for payment id 

@payment.amount #for amount 

@user.first_name #for user name 
+0

Großartig. Es ist jetzt fertig. Vielen Dank. –

0

Steuerungsobjekte wie params oder current_user sind nicht im Kontext Ihrer Mailer definiert.

Sie müssen diese Werte entweder für den Benutzer festlegen oder sie als zusätzliche Argumente in Ihrer Mailer-Methode übergeben. Sie müssen außerdem Instanzvariablen zuweisen, um auf diese Werte in Ihren Mailer-Ansichten zugreifen zu können (dasselbe Prinzip wie das Übergeben von Instanzvariablen, die in Ihrem Controller an ActionView definiert sind).

class PaymentMailer < ApplicationMailer 
    def success(user, invoice_id, amount) 
     @invoice_id = invoice_id 
     @amount = amount 

     mail(to: "#{user.first_name} #{user.last_name} <#{user.email}>", subject: "Payment Successful") 
    end 
end 

Jedoch scheint es, wie amount, id und user sind alle Variablen eines payment Objekt, so klingt es wie das Objekt sollten Sie wirklich payment zum success Verfahren werden vorbei, statt current_user. Ist das möglich?

+0

Muss ich ** PaymentMailer.success (current_user) .deliver_now ** ändern oder zusätzliche Mailer Aktionslinien hinzufügen, Id und Betrag zu erhalten –

+0

Wenn Sie die Methode in meinem Beispiel verwenden, würden Sie call 'PaymentMailer.success (current_user, invoice_id, amount) .deliver_now' –

+0

' def erfolg (user, invoice_id, amount) 'error __wrong Anzahl der Argumente (1 für 3) __ –