这是我为发送给订阅者的常规电子邮件提供的取消订阅链接的解决方案。它使用 MessageVerifier。
1。生成 user.id 的加密哈希
在我的事件控制器中,我有一个发送电子邮件的 send_notice 操作。我将为取消订阅链接创建一个变量并将其传递给邮件程序。
# app/controller/events_controller.rb
def send_notice
...
@unsubscribe = Rails.application.message_verifier(:unsubscribe).generate(@user.id)
EventMailer.send_notice(@event, @user, @unsubscribe).deliver_later
end
这将获取用户 ID 并生成一个签名和编码的字符串变量@unsubscribe。消息验证程序通过将用户 ID 与您的 secret_key_base(在文件 config/secrets.yml 中找到)和您提供消息的名称(在这种情况下我称之为:unsubscribe 但它可以是任何名称)作为他们所说的盐,并通过称为 SHA1 的算法运行它。确保您的 secret_key_base 保持安全。使用环境变量将值存储在生产中。
在最后一行中,我们将@unsubscribe 变量连同@event 和@user 变量一起传递给邮件程序。
2。将@unsubscribe 哈希变量添加到邮件程序
# app/mailers/event_mailer.rb
def send_notice(event, user, unsubscribe)
@event = event
@user = user
@unsubscribe = unsubscribe
mail(to: user.email, subject: "Event Info")
end
3。将退订链接放在电子邮件中
# app/views/events_mailer/send_notice.html.erb
...
<%= link_to "Unsubscribe", settings_unsubscribe_url(id: @unsubscribe) %>.
注意添加的 (id: @unsubscribe) 参数。这会将编码的用户 ID 附加到以 ? 开头的 URL 的末尾。在所谓的查询参数中。
4。添加路线
添加将用户带到取消订阅页面的路由。然后是他们提交退订时的另一条路线。
# config/routes.rb
get 'settings/unsubscribe'
patch 'settings/update'
5。向 User 模型添加订阅字段
我选择向用户模型添加订阅布尔 (true/false) 字段,但您可以通过多种不同方式进行设置。 rails g migration AddSubscriptionToUsers subscription:boolean.
6。控制器 - 从 URL 解码 user_id
我选择添加一个带有取消订阅和更新操作的设置控制器。生成控制器rails g controller Settings unsubscribe。
当用户单击电子邮件中的取消订阅链接时,它将转到 URL 并将编码的用户 ID 附加到 URL 后的问号作为查询参数。以下是链接的示例:http://localhost:3000/settings/unsubscribe?id=BAhpEg%3D%3D--be9f8b9e64e13317bb0901d8725ce746b156b152。
取消订阅操作将使用 MessageVerifier 取消签名和解码 id 参数以获取实际的用户 id 并使用它来查找用户并将其分配给 @user 变量。
# app/controllers/settings_controller.rb
def unsubscribe
user = Rails.application.message_verifier(:unsubscribe).verify(params[:id])
@user = User.find(user)
end
def update
@user = User.find(params[:id])
if @user.update(user_params)
flash[:notice] = 'Subscription Cancelled'
redirect_to root_url
else
flash[:alert] = 'There was a problem'
render :unsubscribe
end
end
private
def user_params
params.require(:user).permit(:subscription)
end
7。观看次数
添加包含取消订阅表单的取消订阅页面。
# app/views/settings/unsubscribe.html.erb
<h4>Unsubscribe from Mysite Emails</h4>
<p>By unsubscribing, you will no longer receive email...</p>
<%= form_for(@user, url: settings_update_path(id: @user.id)) do |f| %>
<%= f.hidden_field(:subscription, value: false) %>
<%= f.submit 'Unsubscribe' %>
<%= link_to 'Cancel', root_url %>
<% end %>
您可以通过多种方式进行设置。在这里,我使用了路由到 settings_update_path 的 form_for 助手,并添加了 id 参数:@user.id。在将表单作为查询参数发送时,这会将用户 ID 附加到 URL。 Update 操作将读取它以查找用户并将 Subscription 字段更新为 false。