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)
你所建议的在 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 计算年龄的答案,它看起来与您问题中的代码相同。
| 归档时间: |
|
| 查看次数: |
1797 次 |
| 最近记录: |