Я хочу подтвердить своего пользователя для его регистрации. У меня уже есть дата их рождения, хранящаяся в моей базе данных, поскольку они были отправлены клиентом API. Я хочу, чтобы пользователь подтвердил дату своего рождения, поэтому я настроил проверку подтверждения Rails. В моих параметрах указаны date_of_birth_confirmation
, и это то, что я использую в своей форме.
<%= f.label :date_of_birth_confirmation, "DATE OF BIRTH (MM/DD/YYYY)" %>
<%= f.date_select :date_of_birth_confirmation, ...
Я могу отправить и получить свои параметры, но проверка подтверждения не работает. Мои параметры представлены как
"user" => { "date_of_birth_confirmation(2i)"=>"10", "date_of_birth_confirmation(3i)"=>"5", "date_of_birth_confirmation(1i)"=>"1927" }
, что, как я полагаю, ожидается при выборе даты. Насколько я понимаю, если бы это был только пользователь date_of_birth, а не его dob_confirmation, Rails преобразовал бы его в объект даты, когда он был сохранен в базе данных.
Но когда сравнение выполняется с фактическим значением date_of_birth, оно всегда терпит неудачу, даже если они совпадают. Я предположил, что это из-за того, как работает проверка confirmation
. Поскольку date_of_birth_confirmation
- это всего лишь строка, означающая, что мне нужно преобразовать dob_confirmation в дату, чтобы их можно было сравнить, так что это оказалось моим решением
def verification_params
params[:user][:date_of_birth_confirmation] = format_date_of_birth_confirmation
params.require(:user).permit(
:date_of_birth_confirmation
)
end
# Format date_of_birth_confirmation to be a date so the comparison can be made with date_of_birth
def format_date_of_birth_confirmation
year = params[:user].delete("date_of_birth_confirmation(1i)")
month = params[:user].delete("date_of_birth_confirmation(2i)")
day = params[:user].delete("date_of_birth_confirmation(3i)")
return nil unless year.present? && month.present? && day.present?
"#{year}-#{month}-#{day}".to_date
end
Это работает, когда я его тестирую. Что хорошо!
Но я хотел знать, есть ли лучшее решение? Я не совсем уверен, есть ли более "железный" способ go по этому поводу.