在 Grails 中,如果我定义一个语言环境,并在 i18n 文件上以特定格式设置日期,例如 (dd/mm/AAAA),如果调用一个请求,例如:
http://myapp/myaction?object.date=10/12/2013
当我得到 print:params.date 时,我想到了一个日期对象。
我怎样才能在rails上做同样的事情?
在 Grails 中,如果我定义一个语言环境,并在 i18n 文件上以特定格式设置日期,例如 (dd/mm/AAAA),如果调用一个请求,例如:
http://myapp/myaction?object.date=10/12/2013
当我得到 print:params.date 时,我想到了一个日期对象。
我怎样才能在rails上做同样的事情?
通常,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 帖子。