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

nul*_*tek 5 ruby forms activerecord datetime ruby-on-rails-3

我有一个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
Run Code Online (Sandbox Code Playgroud)

Moh*_*mad 5

你所建议的在 Ruby 中是不可能的。您可以使用 JavaScript。

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

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

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

看看这个答案,它向您展示了如何根据输入日期计算人的年龄。

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

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

# This is taken directly from this answer: /sf/answers/496437581/
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;
}
Run Code Online (Sandbox Code Playgroud)

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

class Person
  before_save :set_age

private

  def set_age
    self.age = # Calculate age here.
  end
end
Run Code Online (Sandbox Code Playgroud)

请参阅有关如何使用 Ruby 计算年龄的答案,它看起来与您问题中的代码相同。

  • @JetAbe,Mohamad 于 5 月 29 日发布了上述内容(并很好地归功于 [another answer](http://stackoverflow.com/questions/4060004/calculate-age-in-javascript/7091965#7091965)),8 分钟后编辑添加了关于服务器验证的注释,然后[几天后的 6 月 4 日你来了并发布了你的](http://stackoverflow.com/posts/23828931/timeline)。你为什么抱怨抄袭? (2认同)