check if a date is older that the current time in Rails - ruby-on-rails

I am doing a validations in my model to check if a date is older than today (meaning a date can only be in future from the current time)
I was about to write down a block of code, but was wondering is there a build in function for this.
The date is passed from a view using:
<%= date_select ('load', :valid_until, :order => [:day, :month, :year]) %>
All ideas are appreciated.

Yep, there's indeed a built-in date.future? method.

Related

rails date_select, select year only

I have a form which allows user to select date, in the view i have it so the user only selects the year, but when the date is saved, it saves todays day and month along with it? all I want it to display is the year, which the user selects, this is my code:
<%= f.date_select :finishdate, :order => [:year] %><br>
If you wish to show only the year value in the form and store it in the database without the month and day, then you can have an integer field and only show the year value as follows:
<%= f.select :finishdate,Date.today.year-10 .. Date.today.year+10 %>
you can try
<%= f.select_year :finishdate, :order => [:year] %><br>
What is the end result that you'd like to work with? If it is only the year, you'll probably not want to use the date_select as that, I believe, will return a DateTime instance and not just the year.
If you do need just the year, you can look into other helpers like select_year.

Rails 3 Formtastic. How can I make formtastic display only the month and year fields WITHOUT the day?

I need formtastic to display only month and year fields, WITHOUT the day fields.
The datepicker is nice but it shows the whole calendar. I don't want the datepicker.
f.input :accounting_month, :label => "Accounting month", :as => :datepicker
All I need is the month and year.
There is a way to do this:
<%= f.input :accounting_month, :label => "Accounting month", :order => [:month, :year]
This will automatically hide the "day" input and give it a default value of 1.
try this
f.input :accounting_month, :as => :date_select, :discard_day => true
It doesn't work that way because without day this implies 28-31 (depending on month) days and it could be any one of them. If you use want to store a month-year selection without day you'll see it is a range of dates, not "a" date.
Advice with dates is to always store the whole date as a date field. If you only know month and year you'll need to have two (non-date) fields, one for each. But as you can see it's going to lose you a lot and you'll need to custom craft each field, validate it, etc. major pain so needs pretty good reason to do it..
The only other thing I can suggest is:
create a hidden div, or apply css if you can't 'get inside' the standard date field on the form, for the 'day'. Then set the value to always be 01. Then you might have a 'date' set of fields that will save 01-month-year to the database. This is definitely a 'hack'!
With the new syntax in Ruby 1.9
f.input :date, as: :date_select, discard_day: true

Passing a date from a form

I have a form where the user will select a date range, and then a report will be presented based on that date range.
The relevant bit of my Rails form looks like this...
<div class="field">
<b>Start Date</b><br />
<%= date_select :startDate, options = {:order => [:day, :month, :year]} %>
</div>
<div class="field">
<b>End Date</b><br />
<%= date_select :endDate, options = {:order => [:day, :month, :year]} %>
</div>
However, I'm having trouble figuring out how to access the resulting dates in the controller. I've put the following diagnostics in the controller,
puts params[:startDate]
puts params[:endDate]
puts Date.today
...and this shows,
orderdaymonthyear(1i)2011orderdaymonthyear(2i)3orderdaymonthyear(3i)21
orderdaymonthyear(1i)2011orderdaymonthyear(2i)10orderdaymonthyear(3i)21
2011-10-21
My search, is defined at follows,
SalesActivity.find(:all, :conditions => {:created_at => params[:startDate]..params[:endDate]})
...and this gives the exception, 'bad value for range'.
Pointers to how to pass and use a Date range would be appreciated.
Thanks to the helpful suggested answers, I learned that the area I needed to dig into was multiparameter attributes. However, the answer referenced by Julik seems more complex than what I need.
However, I did find this,
http://snippets.dzone.com/posts/show/4630
Which gave me what I was looking for so, my [now working] code looks like this,
#start_date = Date.civil(params[:range][:"startDate(1i)"].to_i,
params[:range][:"startDate(2i)"].to_i,
params[:range][:"startDate(3i)"].to_i)
#end_date = Date.civil(params[:range][:"endDate(1i)"].to_i,
params[:range][:"endDate(2i)"].to_i,
params[:range][:"endDate(3i)"].to_i)
Thanks again for the help.
This answer explains what these parameters are and how they are structured. AFAIK for now Rails does not offer an easy way to add multiparameter assignment support to an arbitrary object (which is what you would want in this case).
Try SalesActivity.all.where("created_at > ? AND created_at < ?", params[:startDate], params[:endDate])
Technically this is not an answer to your specific question, but it is a solution to your problem.
Have you considered using a date select javascript calendar helper? As such in your user interface your user has to select from 6 drop down lists. It may be simpler for them to select 2 from 2 calendar instances. You will then get the value for start date and end date as strings.

Ruby on rails 3 select box values combined ready for validation, is this possible?

I have created a custom date_Select field using 3 separate select fields:
<%= f.select :day, options_for_select(User::DAYS), :include_blank => "Day:" %>
<%= f.select :month, options_for_select(User::MONTHS), :include_blank => "Month:" %>
<%= f.select :year, options_for_select(User::YEAR_RANGE), :include_blank =>"Year:" %>
In my User.rb (Model) I have this validation rule and also using validates_timelessness gem:
MONTHS = ["January", 1], ["February", 2]..etc
DAYS = ["01", 1], ["02", 2], ["03", 3]..etc
START_YEAR = Time.now.year - 111
END_YEAR = Time.now.year
YEAR_RANGE = START_YEAR..END_YEAR
validates :birthday, :timeliness => {:on_or_before => lambda { Date.current }, :type => :date, :on_or_before_message => "Select a valid birthday"}
I have created some tests which work perfectly fine with the date_select that comes with rails but that date_select is buggy which is why I opted for a custom one. My only issue now is I wish to get day, month and year to work with my :birthday symbol. How do I combine all 3 so that my :birthday symbol can use the select data? If that makes sense...
The date_select would have been perfect but it lets users submit a form without the yea being filled out and if a users chooses 1 for a day and clicks submit it will automatically select january. I haven't found a way round that.
So I'm using 3 separate select fields which I want to combine and make work with :birthday just like date_select did.
Help is appreciated.
i would recommend using a date-select pop-up.
There are several gems available. I have used the one detailed in http://www.rubyinside.com/calendar-date-select-a-lightweight-prototype-based-datetime-picker-for-rails-developers-573.html with success.
Once you have a real date field you'll be in a better position to perform date type validations including ranges and presence that you can be confident in worrectly with that type of data.
The select_date isn't buggy, you need to perform the necessary data validation on your end so an empty year isn't allowed. Validation is designed to let you specify what data is allowed into your app. Only you can be the gatekeeper of what is considered 'valid'.

How to change datetime intervals in Formtastic

Formtastic currently automatically creates a range of 1..59 for datetime inputs.
But what if I wanted the datetime minute options to be 0, 15, 30, 45?
Is there a way I can set the collection for a datetime in Formastic?
Thanks in advance
You can try to use :minute_step => 15 option, for example:
<%= form.input :created_at, :minute_step => 15 %>
Look at select_minute Rails method docs and time_select.
Looks like Formtastic uses Rails select_* methods.
This may be helpful
https://github.com/tamoyal/simple_time_select

Resources