Railsで掲示板サイトを作成中の者です。
現在、メール内のリンクをクリックすることでアカウントの有効化を完了させるという機能を実装させようとしているのですが、
下記の不具合が発生して困っております。
#困っていること
コンソール上に表示されるメール文に、下記の不具合が発生してしまう。
・ブラウザユーザー登録フォームから、漢字でユーザー名を登録すると、コンソール常に表示されるデータに余計な文字が入ってしまう。
→Hi 山田太郎
と表示されるはずが、Hi =E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8E
とコンソール上に表示されてしまう。
・クエリパラメータに余計な文字が入ってしまう。
edit?email=yamada-t-t%40example.com
と表示されるはずが、edit?email=3Dyamada-t-t%40example.com
と表示されてしまう。(メールアドレスの先頭に3D
という文字が入る)
#コンソールに表示されているデータ UserMailer#account_activation: processed outbound mail in 7.7ms Delivered mail 603c32d2a24ae_1afd243f6a08265@ip-172-31-16-95.ap-northeast-1.compute.internal.mail (65.1ms) Date: Mon, 01 Mar 2021 00:18:26 +0000 From: noreply@example.com To: yamada-t-t@example.com Message-ID: <603c32d2a24ae_1afd243f6a08265@ip-172-31-16-95.ap-northeast-1.compute.internal.mail> Subject: Account activation Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="--==_mimepart_603c32d2a02e7_1afd243f6a08139"; charset=UTF-8 Content-Transfer-Encoding: 7bit ----==_mimepart_603c32d2a02e7_1afd243f6a08139 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi =E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8E,=0D #←「Hi 山田太郎」と表示させたい。 =0D Welcome to the Sample App! Click on the link below to activate your accou= nt:=0D =0D https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazon= aws.com/account_activations/yEis1o0ztRx9FlXQgwi8VQ/edit?email=3Dyamada-t-= t%40example.com=0D =0D ----==_mimepart_603c32d2a02e7_1afd243f6a08139 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable <!DOCTYPE html>=0D <html>=0D <head>=0D <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dutf= -8" />=0D <style>=0D /* Email styles need to be inline */=0D </style>=0D </head>=0D =0D <body>=0D <h1>Sample App</h1>=0D =0D <p>Hi =E5=B1=B1=E7=94=B0=E5=A4=AA=E9=83=8E,</p>=0D =0D <p>=0D Welcome to the Sample App! Click on the link below to activate your accou= nt:=0D </p>=0D =0D <a href=3D"https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northea= st-1.amazonaws.com/account_activations/yEis1o0ztRx9FlXQgwi8VQ/edit?email=3D= yamada-t-t%40example.com">Activate</a>=0D </body>=0D </html>=0D ----==_mimepart_603c32d2a02e7_1afd243f6a08139-- Redirected to https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/ Completed 302 Found in 731ms (ActiveRecord: 25.6ms | Allocations: 17348)
#関係があると考えているコードは下記です。
#user_mailer/account_activation.html.erb <h1>Sample App</h1> <p>Hi <%= @user.name %>,</p> <p> Welcome to the Sample App! Click on the link below to activate your account: </p> <%= link_to "Activate", edit_account_activation_url(@user.activation_token,email: @user.email) %>
#user_mailer/account_activation.text.erb Hi <%= @user.name %>, Welcome to the Sample App! Click on the link below to activate your account: <%= edit_account_activation_url(@user.activation_token,email: @user.email) %>
#previews/user_mailer_preview.rb # Preview all emails at https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer class UserMailerPreview < ActionMailer::Preview # Preview this email at https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer/rails/mailers/user_mailer/account_activation def account_activation user = User.first user.activation_token = User.new_token UserMailer.account_activation(user) end # Preview this email at https://33ce5896aab4435d8d606eea9e41a7db.vfs.cloud9.ap-northeast-1.amazonaws.com/rails/mailers/user_mailer/rails/mailers/user_mailer/password_reset def password_reset UserMailer.password_reset end end
#maillers/user_mailer.rb class UserMailer < ApplicationMailer def account_activation(user) @user = user mail to: user.email, subject: "Account activation" end def password_reset @greeting = "Hi" mail to: "to@example.org" end end
#model/user.rb class User < ApplicationRecord attr_accessor :remember_token, :activation_token before_save :downcase_email before_create :create_activation_digest validates :name, presence: true, length: { maximum: 50 } VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(.[a-z\d\-]+)*.[a-z]+\z/i validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX }, uniqueness: true has_secure_password validates :password, presence: true, length: { minimum: 6 }, allow_nil: true #渡された文字列のハッシュ値を返す def User.digest(string) cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost BCrypt::Password.create(string, cost: cost) end # ランダムなトークンを返す def User.new_token SecureRandom.urlsafe_base64 end # 永続セッションのためにユーザーをデータベースに記憶する def remember self.remember_token = User.new_token update_attribute(:remember_digest, User.digest(remember_token)) end #渡されたトークンがダイジェストと一致したらtrueを返す #ここでのremember_tokenは、attr_accessor :remember_tokenで定義したアクセサとは異なる。 def authenticated?(attribute, token) digest = self.send("#{attribute}_digest") return false if digest.nil? BCrypt::Password.new(digest).is_password?(token) end #ユーザーのログイン情報を破棄する def forget update_attribute(:remember_digest, nil) end private # メールアドレスを全て小文字にする def downcase_email self.email = email.downcase end # 有効化トークンとダイジェストを作成および代入する。 def create_activation_digest self.activation_token = User.new_token self.activation_digest = User.digest(activation_token) end end
#試したこと
ユーザー名を、アルファベット表示で入力してみました。
その結果、コンソール上には余計なデータは入りませんでした。
また、account_activation.text.erb
とaccount_activation.html.erb
の中に、改行や空白が無いことも確認しましたが、入っておりません。
以上でございます。
ご回答頂けますと幸いです。
恐れ入りますが、ご確認のほどよろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/01 07:10
2021/03/01 08:08
2021/03/01 08:13 編集
2021/03/01 12:05 編集
2021/03/01 12:15