Rails表单:根据日期设置自动设置未来日期

时间:2013-05-19 03:01:13

标签: ruby-on-rails datetime

我的Rails表单要求用户输入事件的开始日期,然后输入同一事件的结束日期。我将默认开始日期设置为Time.now

用户是否可以选择在开始日期或之后发生的结束日期? (所以当他们改变开始日期,结束日期自动更新时)?

我的事件控制器:

def new
    @event = Event.new(params[:event])

    # set date_start field to be today's date
    @event.date_start = Time.now
    @event.date_end = @event.date_start     
end

表格(缩短......)

<%= form_for(@event) do |f| %>  
    <%= f.label :date_start, "Start date" %>
    <%= f.date_select(:date_start, :prompt => { :day => 'Day', :month => 'Month', :year => 'Year' }) %>             

    <%= f.label :time_start, "Start time" %>
    <%= f.time_select :time_start, { :minute_step => 5 } %>                             


    <%= f.label :date_end, "End date" %>
    <%= f.date_select(:date_end, :prompt => { :day => 'Day', :month => 'Month', :year => 'Year' }) %>   
<% end %>

2 个答案:

答案 0 :(得分:3)

您最终将使用Javascript来执行此操作。您可以考虑使用javascript datapicker来提供帮助。那里有很多它们都允许范围,这是一个例子:

http://api.jqueryui.com/datepicker/#option-minDate

答案 1 :(得分:3)

您可以阻止用户使用date_end < date_start模型event保存validate的活动。用户仍然可以在您的字段中选择不正确的日期,但他们将无法将此类事件保存到数据库。

如果你想阻止他们甚至选择一个不正确的date_end你需要在这里使用JS,正如Swards在下面所说的那样。 jQuery UI Datepicker是一个很好的解决方案。

如果模型中的validate对您来说足够了,我认为它应该可行(我还没有测试过):

class Event < ActiveRecord::Base
   attr_accessible :date_end, :date_start, ...
   validate :incorrect_date_check, :on => :create
.
.
.
private

def incorrect_date_check
   if date_end < date_start and date_end < Date.today
      errors.add("Incorrect end date!")
   end
end