我有一个带有 time_select 和 jquery datepicker 的表单,
我希望能够在提交表单时将 time_Select 和日期选择器的值合并到 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 中合并它们,或者也许您有更好的主意...您觉得怎么样?
谢谢
迈克。
最佳答案
简短的回答是:没关系,它们都同样好。
您有 3 个合理的地方可以处理这个问题。
- 在客户端中提交时使用 JavaScript。
- 在 Controller 中。
- 在模型中。
无论您使用什么方法,您都必须在 Controller /模型中处理数据,因为所有参数都以字符串形式接收。
在模型和 Controller 变体中,您需要做出额外的决定。将 DateTime 从 6 个字段拼凑在一起或使用一对字符串(一个包含值,一个包含 strptime 格式。)
知道DateTime的构造函数方法从一组单独的字段构建日期时间对象所需的工作量与从日期时间字符串和格式字符串构建对象所需的工作量大致相同。如何构建 DateTime 对象并不重要。
所以这一切都归结为个人喜好问题。
我个人认为这个逻辑属于模型。我不会把它放在 JavaScript 中,因为我想确保如果 JavaScript 被禁用,我的代码不会中断。 Controller 同样适合。但我觉得将这种逻辑转移到模型可以更稳健地处理日期和验证。我还发现 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
关于jquery - time_select() 帮助器 + jQuery UI 日期选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1740420/