【发布时间】:2020-06-18 07:32:57
【问题描述】:
我想验证我的用户是否注册。我已经将他们的出生日期存储在我的数据库中,因为他们是从 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
当我测试它时,这似乎有效。哪个好!
但我想知道是否有更好的解决方案?我不完全确定是否有更“有条理”的方式来解决这个问题。
【问题讨论】: