0

I never used javascript in rails, and i have pretty basic questions about this matter. This is what i want to implement in my application:

"In my application, when a user is being created, s/he can select their birthdate by choosing a year, a month, and a day in three different drop-downs. Presently, the user is able to choose a future date as his birth date. I'm in need a way to check if the user is selecting a valid date and warn them in the event the date is invalid."

I would like to know what am i doing wrong. Thanks anyway!

In view (form):

<div class="control-group">
  <%= f.label "Date of Birth (YYYY-MM-DD)", :class => 'control-label' %>
  <div class="controls">
    <%= f.select :year_Of_Birth , options_for_select((Time.now.year - 100)..(Time.zone.now.year )), :include_blank => true, :id => "year",:onchange => 'validDate()'%>
    <%= f.select :month_Of_Birth, 1..12 , :include_blank=> true, :onchange => 'validDate()', :id => "month"  %>
    <%= f.select :day_Of_Birth, 1..31 , :include_blank => true, :onchange => 'validDate()', :id => "day"  %>
  </div>
</div>

In my application.js:

function validDate(){
    var y = document.getElementById("year").value;
    var m = document.getElementById("month").value;
    var d = document.getElementById("day").value;

    if(m==2 && leapYear(y)==false && d>28)
        document.write("Invalid Date.");
    if(m==2 && leapYear(y)==true&& d>29)
        document.write("Invalid Date.");
    if(m==4 && d>30)
        document.write("Invalid Date.");
    if(m==6 && d>30)
        document.write("Invalid Date.");
    if(m==8 && d>30)
        document.write("Invalid Date.");
    if(m==9 && d>30)
        document.write("Invalid Date.");
    if(m==11 && d>30)
        document.write("Invalid Date.");
}

function leapYear(year)
    {
        return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }

1 Answer 1

1

You could use the JavaScript's Date

var y = document.getElementById("year").value;
var m = document.getElementById("month").value;
var d = document.getElementById("day").value;

// selected date, the month has index of 0
var selectedDate = new Date(y, m - 1, d);
// first day of next month
var maxAllowedDateForMonth = new Date(y, m, 1);
// date now to check for future dates
var now = new Date;
if (selectedDate < maxAllowedDateForMonth && selectedDate < now)
{
  document.write("Invalid Date.");
}
Sign up to request clarification or add additional context in comments.

2 Comments

do you know if i'm calling the js function correctly ?
The function is called correctly, but ideally you'd use unobtrusive style of declaring JS events on JS files.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.