0

在我的主干应用程序中,我决定将我的 API 返回日期作为 unix 时间戳(整数)。当我在骨干模型上调用 save 时,它​​会将这些整数发送到 rails,但是 rails 似乎将它们一起跳过,这是有道理的,因为它实际上只是一个整数,那么它怎么知道呢?

是否有任何“自动”解决方案,rails 会将它们识别为日期并相应地在我的参数哈希中提供它们?没有手动转换这些属性?

到目前为止,我有两个解决方案:

在客户端执行,覆盖骨干模型中的 toJSON() 方法:

toJSON: ->
  attrs = @attributes
  attrs.start = new Date(@attributes.start)
  attrs.finish = new Date(@attributes.finish)
  _.clone( attrs )

我不喜欢这种方法,因为我失去了为什么我首先切换到使用时间戳的好处:能够使用主干的 findWhere(start:timestamp)。是的..所以,毫无意义。

服务器端:

params[:event][:start] = DateTime.strptime(params[:event][:start].to_s,'%s')

还是我疯了,应该以其他方式来做?我了解 Rails 旨在与 Backbone 相处融洽。我基本上是在寻找一种按日期客户端搜索事件的简单方法。

4

2 回答 2

0

没有自动转换机制(因为不能假定整数是时间戳,甚至是长的!),但是使用 before_filter 很容易,就像您发现的那样。此外,将其包装起来并使其更清洁一点也不难:

def convert_javascript_times!(hash)
  return unless hash
  hash.each do |key, val|
    hash[key] = Time.at(val.to_i / 1000)
  end
end

before_filter only: [:create, :update] { convert_javascript_times! params[:event] }
于 2013-07-18T02:15:28.130 回答
0

如果您有更好的想法,请告诉我,但我会将其标记为已回答...

我最终使用了一个简单的 before_filter 在我的事件控制器上创建和显示操作。有时你想让 Rails 为你做很多神奇的事情,写 2 条自定义线是懒惰的!

before_filter only: [:create, :update] do
  params[:event][:start] = DateTime.strptime((params[:event][:start]/1000).to_s,'%s') if params[:event][:start].present?
  params[:event][:finish] = DateTime.strptime((params[:event][:finish]/1000).to_s,'%s') if params[:event][:start].present?
end
于 2013-07-18T02:07:49.467 回答