Rails根据日期输入自动填充表单字段

时间:2014-05-23 12:12:45

标签: ruby ruby-on-rails-3 forms datetime activerecord

我有一个Rails 3.2.18应用程序,在我的表单中我有一个年龄(int)和出生日期(datetime)的字段。我将使用一个简单的jQuery日期选择器来选择DOB。

这就是我想要发生的事情。

第一个字段是DOB(出生日期)。我想选择它,并且一旦它被选中,我想计算年龄并根据该选择自动填充年龄字段。

我想我可以通过在模型上创建计算年龄的方法来实现,但我不确定如何在年龄字段中填充它。也许是一些Javascript或什么?

非常感谢任何帮助。

下面是我为另一个应用程序编写的方法,该方法根据DOB计算年龄并可以在视图中使用:

def age(dob)
    now = Time.zone.now.to_date
    now.year - patient_dob.year - ((now.month > patient_dob.month || (now.month == patient_dob.month && now.day >= patient_dob.day)) ? 0 : 1)
  end

2 个答案:

答案 0 :(得分:3)

你建议用Ruby做什么。您可以使用JavaScript。

如果没有首先前往服务器,计算年龄,然后将结果呈现给客户,则无法根据用户输入计算年龄。该模型不知道用户输入的日期;这是,除非你提交表格,当然。

可以通过Ajax提交表单。例如,某些网站允许您填写邮政编码,然后他们会为您预先填写地址。实际情况是,在幕后,浏览器正在向返回地址的服务器发送ajax请求。

在您的情况下,您不应该这样做,因为在JavaScript中计算年龄非常容易。它也可以更快地在客户端上进行,因为它可以节省您到服务器的往返。

查看this answer,其中显示了如何根据输入日期计算人员年龄。

如果您使用Rails,您可能会使用jQuery。在这种情况下,您可以执行以下操作:

$('#date_input').on('change', function () {
  date = $(this).val();
  age = getAge(date);
  $('#age_input').val(age);
});

# This is taken directly from this answer: https://stackoverflow.com/a/7091965/276959
function getAge(dateString) {
    var today = new Date();
    var birthDate = new Date(dateString);
    var age = today.getFullYear() - birthDate.getFullYear();
    var m = today.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && today.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

然后,在服务器上,您可能希望在将数据保存到数据库之前重新计算年龄。这是因为没有什么能阻止用户直接提交虚假年龄。通过填写,或通过改变DOM。

class Person
  before_save :set_age

private

  def set_age
    self.age = # Calculate age here.
  end
end

See this answer关于如何使用Ruby计算年龄,这看起来与您在问题中的代码相同。

答案 1 :(得分:0)

这是使用服务器实现此日期准确性的更客户端javascript方式。

在父页面加载时的rails视图中

<%= javascript_tag do%>
    var currDate = new Date('<%= Date.today%>');
<%end%>

在您的js文件中(我假设日期选择器是使用日期选择器选择的输入。)

function calcAge(dateString) {
    var birthDate = new Date(#('date_picker').val());
    var age = currDate.getFullYear() - birthDate.getFullYear();
    var m = currDate.getMonth() - birthDate.getMonth();
    if (m < 0 || (m === 0 && currDate.getDate() < birthDate.getDate())) {
        age--;
    }
    return age;
}

然后只需要在日期选择事件和

上调用calcAge
return age; 

可以更改为输入字段的设置值

$('#ageField').val(age);