我有一个带有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或者你有更好的想法......你怎么看?
谢谢,
麦克
答案 0 :(得分:3)
简短的回答是:没关系,它们同样好。
你有3个合理的地方可以解决这个问题。
无论使用何种方法,都必须处理控制器/模型中的数据,因为所有参数都是作为字符串接收的。
在模型和控制器变体中,您需要做出额外的决定。将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