Редактировать SSN в форме отображения под Rails 4?

У меня есть приложение Rails 4, и я использую attr_encrypted гем для хранения 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 драгоценный камень для моих форм, но если я использую основные, <%= f.text_field :ssn %> синтаксис, я вижу тот же полный SSN.

Что я здесь не так делаю?

2 ответа

Решение

Это то, что я в итоге сделал,

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

Это немного странно, но он отображает SSN с отредактированной строкой, но затем не сохраняет строку с отредактированными битами, *, чтобы сохранить плохие данные от получения базы данных.

Я предлагаю что-то другое.

Держите ваши obfuscated_ssn Метод из вашего ответа, имеет смысл иметь его в модели. Однако, переопределив сеттер, как это... ну, я бы пошел другим путем. Что мне действительно не нравится, так это то, что вы делаете проверки в сеттере. Я проверил страницу гема, но не смог найти ничего, связанного с валидацией, но обычно ваша модель включала бы правила валидации, такие как

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

Я не знаю, достаточно ли у него ssn gem для выполнения проверок только на незашифрованных данных...

Но в любом случае вот как я бы настроил вашу форму / контроллер:

Ваша форма

вам нужно выяснить, как отобразить одно поле и отправить в совершенно другое

Я предлагаю изменить значение по умолчанию, отображаемое полем (Ruby doc для text_ field:)

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
Другие вопросы по тегам