1

Grails で、ロケールを定義し、(dd/mm/AAAA) のような i18n ファイルの特定の形式に日付を入れると、次のような 1 つの要求を呼び出します。

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

print: params.date を取得すると、日付オブジェクトが表示されます。

レールで同じことを行うにはどうすればよいですか?

4

1 に答える 1

0

通常、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 投稿を参照してください。

于 2013-03-21T23:50:41.183 に答える