time_select()helper + jQuery UI datepicker

时间:2009-11-16 06:29:34

标签: jquery ruby-on-rails

我有一个带有time_select和jquery datepicker的表单,

我希望能够在提交表单时将time_Select和datepicker的值合并到我的ActiveRecord模型的一个日期时间...

有优雅的方式吗? 我应该做客户端还是服务器端......我想让我的行动简单:

  def create
    @drive = Drive.new(params[:drive]))
    if @drive.save
      flash[:notice] = 'Drive created !'
      render :action => :show 
    else
      render :action => :new
    end
  end

我不知道......我应该在模型中使用虚拟属性并将它们合并到before_save中,也可以在提交表单时使用javascript或者你有更好的想法......你怎么看?

谢谢,

麦克

1 个答案:

答案 0 :(得分:3)

简短的回答是:没关系,它们同样好。

你有3个合理的地方可以解决这个问题。

  1. 在提交javascript的客户端中。
  2. 在控制器中。
  3. 在模型中。
  4. 无论使用何种方法,都必须处理控制器/模型中的数据,因为所有参数都是作为字符串接收的。

    在模型和控制器变体中,您需要做出额外的决定。将6个字段中的DateTime拼凑在一起或使用一对字符串(一个包含值,一个包含strptime格式。)

    知道DateTime的构造函数方法需要大约相同的工作量才能从一组单独的字段构建日期时间对象,就像从日期时间字符串和格式字符串构建对象一样。如何构建DateTime对象并不重要。

    所以这一切都归结为个人偏好。

    我个人认为这个逻辑属于模型。我不会把它放在javavascript中,因为我想确保我的代码在Javascript被禁用时不会中断。控制器同样适合。但我觉得将此逻辑卸载到模型允许更加健壮地处理日期和验证。我还发现strptime构造函数比7参数民用构造函数更容易阅读。但民用构造函数并不要求我确保格式小时/分钟/秒正好是2位数。无论哪种方式,我都会将年,月,日,小时,分钟和秒偏移作为单独的attr_accessors字段,因此我可以在必要时处理这些数据。

    示例代码

    class Drive < ActiveRecord::Base
      ...
      attr_accessor :year, :month, :day, :hour, :minute, :second, :locale_offset
    
      before_validation :build_date
      validates :future_time
    
      def build_date
        begin 
          self.date  = DateTime.civil( year.to_, month.to_i, day.to_i,
                         hour.to_i, minute.to_i, second.to_i, user.locale_offset)
        rescue 
          errors.add(:date, "Invalid date")
          return false
        end  
      end
    
      def future_time
        unless date > DateTime.now 
          errors.add(:date, "Date occurs in the past.")
        end
      end
    end