1

在 Grails 中,如果我定义一个语言环境,并在 i18n 文件上以特定格式设置日期,例如 (dd/mm/AAAA),如果调用一个请求,例如:

http://myapp/myaction?object.date=10/12/2013

当我得到 print:params.date 时,我想到了一个日期对象。

我怎样才能在rails上做同样的事情?

4

1 回答 1

0

通常,Rails 会为您处理这个问题。例如,表单助手datetime_select与一些activerecord 魔术一起工作, 以确保时间/日期类型在往返过程中仍然存在。标准日期选择器有多种替代方案。

如果这对您不起作用,例如 rails 没有生成表单,那么(至少)有几个选项。

一种选择,略带 evi,是猴子补丁HashWithIndifferentAccess(由请求参数使用)根据键名进行类型转换。它可能看起来像:

module AddTypedKeys

  def [](key)
    key?(key) ? super : find_candidate(key.to_s)
  end

private

  # look for key with a type extension  
  def find_candidate(key)
    keys.each do |k|
      name, type = k.split('.', 2)
      return typify_param(self[k], type) if name == key
    end
    nil
  end

  def typify_param(value, type)
    case type
      when 'date'
        value.to_date rescue nil
      else
        value
    end
  end   
end


HashWithIndifferentAccess.send(:include, AddTypedKeys)

这将以您描述的方式扩展 params[] 。要在 rais 中使用它,您可以将其放入初始化程序中,例如confg/initializers/typed_params.rb

要查看它的工作原理,您可以使用

params = HashWithIndifferentAccess.new({'a' => 'hello', 'b.date' => '10/1/2013', 'c.date' => 'bob'})
puts params['b.date'] # returns string 
puts params['b'] # returns timestamp
puts params['a'] # returns string
puts params['c'] # nil (invalid date parsed)

但是......我不确定这是否值得,它可能不适用于 Rails 4 / StrongParameters。

更好的解决方案是在模型中使用虚拟属性。有关使用慢性的一个非常好的示例,请参阅此 SO 帖子

于 2013-03-21T23:50:41.183 回答