Grails で、ロケールを定義し、(dd/mm/AAAA) のような i18n ファイルの特定の形式に日付を入れると、次のような 1 つの要求を呼び出します。
http://myapp/myaction?object.date=10/12/2013
print: params.date を取得すると、日付オブジェクトが表示されます。
レールで同じことを行うにはどうすればよいですか?
Grails で、ロケールを定義し、(dd/mm/AAAA) のような i18n ファイルの特定の形式に日付を入れると、次のような 1 つの要求を呼び出します。
http://myapp/myaction?object.date=10/12/2013
print: params.date を取得すると、日付オブジェクトが表示されます。
レールで同じことを行うにはどうすればよいですか?
通常、Rails がこれを処理します。たとえば、フォーム ヘルパーは、いくつかのアクティブ レコード マジックdatetime_select
と連携して動作し、
時間/日付型が確実にラウンドトリップに耐えられるようにします。標準の日付ピッカーにはさまざまな代替手段があります。
Rails がフォームを生成しないなど、これがうまくいかない場合は、(少なくとも) いくつかのオプションがあります。
1 つのオプション (わずかに 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 投稿を参照してください。