[RUBY] Das Problem, dass das Attribut des Benutzermodells in ActionMailer gleich Null wird

Ausführungsumgebung

Was ich versucht habe zu tun

Senden Sie eine E-Mail, wenn Sie einen neuen Benutzer erstellen

app/controllers/users_controller.rb


class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      UserMailer.activation(@user).deliver_later
      redirect_to root_url
    else
      render "new"
    end
  end
end

Übergeben Sie das Benutzerobjekt

app/mailers/user_mailer.rb


class UserMailer < ApplicationMailer
  def activation(user)
    @user = user
    mail(to: @user.email, subject: 'Bitte aktiviere deinen Account')
  end
end

Aktivierungs-Token senden

app/views/user_mailer/activation.html.slim


p= "Hallo,#{@user.name}Herr."

Klicken Sie auf den Link p, um Ihr Konto zu aktivieren
= link_to "Konto aktivieren", edit_account_activation_url(@user.activation_token, email: @user.email)

Das Aktivierungstoken wird beim Benutzer "Erstellen" erstellt

app/models/user.rb


class User < ApplicationRecord
  attr_accessor :activation_token
  before_create :create_activation_digest

  private
    def create_activation_digest
      self.activation_token = SecureRandom.urlsafe_base64
      self.activation_digest = BCrypt::Password.create(activation_token)
    end
end

Fehler aufgetreten

ActionView::Template::Error (No route matches {:action=>"edit", :controller=>"account_activations", :email=>"Adresse", :id=>nil}, possible unmatched constraints: [:id]):

@ user.activation_token ist nil geworden

Untersuchen Sie den Fehler

Wenn Sie sich "@ user.object_id" und "@ user.activation_token" ansehen

44860
"I2BCoTsomoNhqNF0q_zRKw"
[ActiveJob] -----

  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 70], ["LIMIT", 1]]

[ActiveJob] -----
44980
nil

Es ist ein anderes Objekt und activity_token ist auch nil!

Fehlerursache

deliver_later

Wenn Sie eine E-Mail mit "Deliver_Later" senden, können Sie sehen, dass ein Benutzer aus der Datenbank gesucht wird, bevor "UserMailer" ausgeführt wird.

  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 70], ["LIMIT", 1]]

Der Wert des Attributs "activity_token" hat zum Zeitpunkt "@ user.save" nur "@ user", sodass er nach dem Speichern nicht in dem "user" -Objekt referenziert werden kann, das aus der Datenbank abgerufen wurde.

Lösungen

Verwenden Sie "Deliver_Now"

app/controllers/users_controller.rb


class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      UserMailer.activation(@user).deliver_now
      redirect_to root_url
    else
      render "new"
    end
  end
end

Wenn Sie mit Deliver_now senden, wird das Argument unverändert übergeben, sodass es erfolgreich ist!

37900
"2kQLrYZjinTiJFKE3jdPqQ"
37900
"2kQLrYZjinTiJFKE3jdPqQ"

Zusammenfassung von Deliver_now und Deliver_later

deliver_now Senden Sie sofort eine E-Mail

deliver_late Senden Sie die E-Mail später mit "Active Job"

https://railsguides.jp/active_job_basics.html#action-mailer

https://api.rubyonrails.org/classes/ActionMailer/MessageDelivery.html#method-i-deliver_later

Recommended Posts

Das Problem, dass das Attribut des Benutzermodells in ActionMailer gleich Null wird
Das Problem, dass der Inhalt von Parametern vollständig in der Ansicht [Rails] angezeigt wird
Das Problem, dass das Mount-Verzeichnis von Docker Desktop mit WSL2 als Back-End im Windows-Terminal merkwürdig wird (ungelöst ab 29.08.2020?)
Über das Problem des Deadlocks bei der Parallelverarbeitung in gem'sprockets '4.0
[Rails] Registrieren Sie sich mit Devise nach Attributen desselben Modells
Was ist die Darstellung von Domänenwissen im [DDD] -Modell?
Das Problem, dass alle Daten in der Tabelle angezeigt wurden, wurde behoben
Befolgen Sie das Memorandum zur Funktionszuordnung (verstehen Sie die Beschreibung des Benutzermodells).
Ein Programm, das die Anzahl der Wörter in einer Liste zählt
Es wurde das Problem behoben, dass der Name der Verbindungsfactory von TcpConnectionOpenEvent, der von TcpConnection ausgegeben wurde und den Interceptor festlegte, unbekannt wurde.
Das Problem, dass XML-Attribute in Android Studio willkürlich neu angeordnet werden
Formular, das den Wert des sich wiederholenden Elements in Spring MVC erhält
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
Dies und das von JDK
Ein Memorandum über das FizzBuzz-Problem
Reihenfolge der Verarbeitung im Programm
Fälle, in denen Benutzer beim Bearbeiten einer App abgemeldet sind (Rails)
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
Beispielprogramm, das den Hashwert einer Datei in Java zurückgibt
Ignorieren Sie Parameter, die im Modell nicht vorhanden sind, mit ObjectMapper # readValue
[Java] java.lang.NoClassDefFoundError: Behebung des Problems, in org / jsoup / security / Whitelist zu fallen
Ich erhalte folgende Fehler: Der Benutzer muss im Unit-Model-Test vorhanden sein