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
app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
def activation(user)
@user = user
mail(to: @user.email, subject: 'Bitte aktiviere deinen Account')
end
end
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)
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
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
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
!
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.
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"
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