Редактировать 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