如何在Rails中为编辑页面生成到期链接

时间:2018-11-26 05:30:03

标签: ruby-on-rails

我已生成邮件功能。我需要在邮件上生成一个过期链接(对于我的一个模型的编辑页面)。我只需要在模板中添加到期链接。我该怎么做?谁能帮我吗?

在mailer.template中

{{1}}

2 个答案:

答案 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。它将重定向他另一个页面而不更新表单。

根据您的情况需要添加其他功能和条件。

更新:根据要求

  1. 用户单击“编辑”链接时,在编辑操作中将有效期设置为Time.now + 1.day
  2. Update操作中,如果传递了expiry_date,则重定向,否则更新数据。
  3. 重新触发邮件操作时,请将 expiry_date 设置为零。

以上将满足您的要求。