我已生成邮件功能。我需要在邮件上生成一个过期链接(对于我的一个模型的编辑页面)。我只需要在模板中添加到期链接。我该怎么做?谁能帮我吗?
在mailer.template中
{{1}}
答案 0 :(得分:1)
如果您想要一个可以过期的链接,则有2个选项。
1)使用JWT令牌。好处是您不需要任何额外的db列,所有内容都在令牌本身中。
添加
gem "jwt"
到您的Gemfile。
这是我的令牌生成器:
module Tokens
class Generator < Base
EXPIRATION_DELAY = 72.hours
initialize_with expiration_delay: EXPIRATION_DELAY
def call
JWT.encode payload, secret, ENCODING
end
private
def payload
{ exp: expiration_time }
end
def expiration_time
(Time.zone.now + expiration_delay).to_i
end
end
end
然后我将其作为附加参数添加到我想使其可过期的链接中。 当用户点击链接时,我会在控制器中与他/她见面:
before_action :ensure_link_not_expired!
def ensure_link_not_expired!
unless params[:token].present? &&
Tokens::Validator.call(token: params[:token])
redirect_to tenant_root_path, alert: t(".link_not_available")
end
end
令牌验证器在这里:
module Tokens
class Validator < Base
initialize_with :token
def call
decoded_token.present?
rescue JWT::ExpiredSignature
false
end
def decoded_token
JWT.decode token, secret, true, algorithm: ENCODING
end
end
end
ENCODING =“ HS256”,秘密= Rails.application.secret_key_base
2)数据库中存储期限的列。可以理解,我采用了第一种方法,但是您可以轻松地创建带有截止日期字段的相关db记录并进行检查。这对于嵌套资源特别有用。优点-您可以跟踪剩余时间,缺点-如果它不是嵌套资源,则必须将垃圾记录存储在数据库中,并有任务要清理它们
答案 1 :(得分:0)
这仅适用于使用回形针传递时间戳记的回形针或carrierwave gem功能通过回形针通过AWS附件的URL。 :D
您仍然可以通过以下方式实现所需的目标
案例1 :您正在邮寄链接,并且希望授予20分钟(有效时间)内的编辑链接访问权限。
在发送邮件时,将对象中的expiry_date列设置为Time.now + 20.minute
,因此,当他单击时,如果他越过了expiry_date
datetime列,他将被重定向到编辑操作。
情况2 :上述情况1不是您的意图,并且如果用户正在过期以填写编辑表单,则希望使该用户过期。
因此,对于上述情况,当用户单击通过邮件获得的编辑URL(将expiry_date设置为Time.now + 20.minute
)时,他将被重定向到编辑表单。当他提交表单并采取行动时,将调用create/update
。它将重定向他另一个页面而不更新表单。
根据您的情况需要添加其他功能和条件。
更新:根据要求
Time.now + 1.day
Update
操作中,如果传递了expiry_date,则重定向,否则更新数据。以上将满足您的要求。