4

我有一个 Rails 4 应用程序,我正在使用attr_encryptedgem 将 SSN 以加密形式存储在数据库中。

我想要做的是在编辑/显示表格时只显示最后 4 位数字。因此,基本上一旦保存了 SSN,用户就无法在表单中看到完整的 SSN。所以我尝试了以下操作,

class PaymentData < ActiveRecord::Base
  attr_encrypted :ssn, key: 'secret'

  alias_method :org_ssn, :ssn
  def ssn
    org_ssn.reverse # just a way of testing if this works
  end
end

我所看到的显示表格上使用<%= @payment_data.ssn %>,它工作正常。但是在我正在使用的编辑表单上<%= f.input :ssn %>,编辑字段已预先填充了完整的 SSN。

注意:我在simple_form表单中使用 gem,但如果我使用基本<%= f.text_field :ssn %>语法,我会看到相同的完整 SSN。

我在这里做错了什么?

4

2 回答 2

3

这就是我最终做的,

def obfuscated_ssn
  return ssn unless ssn && ssn.size > 3
  ssn.last(4).rjust(ssn.length, '*')
end

def obfuscated_ssn=(ssn)
  self.ssn = ssn unless ssn.include?('*')
end

这有点 hacky,但它显示带有编辑字符串的 SSN,但随后不保存带有编辑位的字符串*,以防止不良数据获取数据库。

于 2013-11-23T01:45:55.683 回答
0

我建议一些不同的东西。

将您的方法从您的答案中保留obfuscated_ssn下来,将其包含在模型中是有意义的。然而,像这样覆盖二传手......好吧,我会采取不同的方式。我真正不喜欢的是,您正在 setter 中进行验证。我检查了 gem 页面,但找不到与验证相关的任何内容,但通常您的模型将包含验证规则,例如

validates_length_of :ssn, :minimum => 5, :maximum => 20, :allow_blank => true

我不知道 ssn gem 是否足够聪明,只能对非加密数据运行验证......

但无论如何,这就是我将如何调整您的表单/控制器:

你的表格

您需要弄清楚如何显示一个字段并提交到一个完全不同的字段

我建议更改字段显示的默认值(用于 text_字段的 Ruby 文档:)

f.text_field(:ssn, :value => f.object.obfuscated_ssn)

现在我不确定你想要的行为。用户是否应该始终编写 ssn 字段?或者如果用户不输入任何内容,您是否希望保持不变?如果是这样,我会对您的控制器进行一些检查

控制器

def model_params
  if params[:your_model][:ssn] == @model.obfuscated_ssn
    params[:your_model].delete(:ssn) # Make sure your model doesn't get updated with obfuscated ssn
  end
  params.require(:your_model).permit(:ssn, etc.)
end
于 2016-01-29T13:57:32.943 回答