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: 'Veuillez activer votre compte')
end
end
app/views/user_mailer/activation.html.slim
p= "Bonjour,#{@user.name}M."
Cliquez sur le lien p pour activer votre compte
= link_to "Activer le compte", edit_account_activation_url(@user.activation_token, email: @user.email)
create
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» est devenu «nul»
@ user.object_id
et @ user.activation_token
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
C'est un objet différent et ʻactivation_token est également
nil`!
deliver_later
Si vous envoyez un e-mail avec livrer_later
, vous pouvez voir qu'il recherche un utilisateur dans la base de données avant d'exécuter ʻUserMailer`.
User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 70], ["LIMIT", 1]]
La valeur de l'attribut ʻactivation_token ne peut pas être référencée dans l'objet ʻuser
obtenu à partir de la base de données après l'enregistrement car il n'a que le @ user
lorsque @ user.save
est exécuté.
delivery_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
Si vous envoyez avec delivery_now
, l'argument sera passé tel quel, donc il réussira!
37900
"2kQLrYZjinTiJFKE3jdPqQ"
37900
"2kQLrYZjinTiJFKE3jdPqQ"
delivery_now
et delater_later
deliver_now
Envoyez un email immédiatement
deliver_late
ʻEnvoyer le courrier plus tard en utilisant 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