如何在Rails中将后续表格设为私有?

时间:2017-09-21 12:20:28

标签: ruby-on-rails forms

我想向客户发送一封电子邮件,允许他们编辑购买的部分信息,因此我的基本设置是向他们发送指向/follow_up_form/purchase.id的链接。

这显然不起作用,因为我们不希望任何人只是输入该URL并更改用户的信息,但我们的网站没有任何登录所需的购买。

有没有办法自动生成秘密网址,或通过某种真实性令牌?这感觉应该很简单,但我没有任何好的想法。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以使用rails 5 has_secure_token并将其作为参数嵌入到URL中,例如/follow_up_form/purchase.id?tok='some_toke'返回表单进行编辑时,请检查此参数。这确实会让事情变得更加安全。

答案 1 :(得分:0)

我会在购买时添加token列,并在创建后设置:

require 'secure_random'
class Purchase < ActiveRecord::Base
  before_create :regenerate_token

  def regenerate_token
    self.token = SecureRandom.urlsafe_base64(24)
  end
end

然后,您可以像设置任何其他嵌套资源一样设置跟进:

resources :purchases do
  resources :follow_ups, only: [:new, :create]
end

要创建指向用户提供反馈的表单的链接:

<%= link_to("Tell us what you think", new_purchase_follow_up_url(@purchase, token: @purchase.token)) %>

这会向包含访问令牌的URL添加查询字符串参数。 要在控制器中进行身份验证,我们会检查访问令牌是否与我们为购买存储的内容匹配:

class FollowUpsController < ApplicationConrtroller
  before_action :set_purchase!
  before_action :check_token!

  # ...

  private 
    def set_purchase!
      @purchase = Purchase.find(params[:purchase_id])
    end

    def check_token!
      unless params[:access_token] == @purchase.token
        redirect_to root_path, error: 'You are not authorized' and return false
      end
    end
end

要在new和create操作之间传递令牌,请将其作为隐藏输入添加到表单中:

<%= form_for(@follow_up) do |f| %>
  <%= hidden_field_tag :access_token, @purchase.token %>
<% end %>