15

問題

  1. Date 属性を持つ Ruby on Rails モデルがあります。
  2. このモデルのフォームでは、単一のテキスト フィールドと JQuery の datepicker を使用してこの属性を表しています (Rails カスタムのように、年、月、日のそれぞれのドロップダウンではありません)。
  3. 日付ピッカーは、フォーマットを使用して日付を挿入しmm/dd/yyyyます。
  4. Rails はdd/mm/yyyyフォーマットのある日付を想定しています。

  • ユーザーが2012 年 3 月 12 日を選択すると、datepicker は を入力します。Rails はこれを2012 年 12 月 3 日03/12/2012と解釈します。
  • ユーザーが2012 年 3 月 20 日を選択すると、datepicker は を入力します。これは、Rails によって 2012 年の20 番目の月03/20/2012の 3 日目として解釈されます。この日付は存在しないため、Rails はこれを値にキャストします (と思います)。nil

質問

この日付テキスト フィールドを解析するときに Rails が使用する日付形式を変更するにはどうすればよいですか?

ノート:

1) 日付ピッカーがテキスト フィールドに挿入する日付の形式を変更したくありません。

2)ビューに日付属性を表示することについて質問していません。

4

5 に答える 5

15

これは Rails の国際化機能で解決できると当初は思っていましたが、それは間違いでした。

Ruby 1.9 以降、日付解析の標準形式は です。これはdd/mm/yyyy、海外のユーザーによりよく対応できるようにするためです。詳細については、この SO answerを参照してください。

この標準は Rails で維持されており、Date.parse現在はフォーム入力からのデータの処理に使用されています。フィールドはコールバック メソッドによって受信されるため、コールバックの使用before_validationは機能しません。nil

現在、この特定の問題に対処する 2 つの gem があります。つまり、Rails での日付の解析が のロケール設定に従っていないという問題ですI18n.locale。どちらもうまく機能しているようです。

  1. clemensによる delocalize - かなりの数またはプロジェクトで正常に適用されているようで、現時点で最も多くの星を獲得しています。

  2. i18n_alchemy by carlosantoniodasilva - これは最近リリースされたものです。著者は Rails のコア チーム メンバーであり、非常に活発なメンバーです。間違いなく一見の価値があります。

于 2013-03-25T04:18:20.157 に答える
3

ピッカーのフォーマットを変更したくないので、実際のモデル プロパティに隠しフィールドを使用することをお勧めします。

たとえば、通常どおりフォーム ビルダーを使用すると仮定して、モデルの日付プロパティに隠しフィールドを追加します。

f.hidden_field :date

次に、ピッカーのテキスト入力については、モデルの日付プロパティにバインドしないでください。非表示フィールドの ID が「modelname_date」で、ピッカー テキスト入力の ID が「date_picker」であるとします。次を使用して機能させます。

$(function(){
  $("#date_picker").datepicker({altField: '#nodelname_date', altFormat: 'dd/mm/yyyy'});
});

このように、日付ピッカーは日付を「mm/dd/yyyy」と表示しますが、Rails は日付を「dd/mm/yyyy」と表示します。

アップデート:

これを Rails 側で解決したい場合は、別の解決策をお勧めします。

  • モデルに仮想プロパティを追加します。attr_accessor :bad_format_date
  • 入力日付を解析して実際のフィールドに割り当てる before_validation コールバックを追加します。
before_validation do
  self.date = Date.strptime(bad_format_date, "%m/%d/%Y")
end

次に、ビューのフォームを使用しますが、フィールド値bad_format_dateで初期化します (編集フォームの場合)。date

于 2013-03-25T01:34:29.357 に答える
0

このようなことを試すことができます。

$(function(){
 $('#date_picker').datepicker( {
      beforeShowDay: $.datepicker.noWeekends, 
      showOtherMonths: true,
      selectOtherMonths: true,
      dateFormat: 'dd-mm-yy',
      defaultDate: date,
      gotoCurrent: true

}); 
于 2013-03-25T03:52:56.173 に答える
0

次のモンキー パッチを config/time_formats.rb に追加するだけです。

class Date
  class << self
    alias :euro_parse :_parse
    def _parse(str,comp=false)
      str = str.to_s.strip
      if str == ''
        {}
      elsif str =~ /^(\d{1,2})[-\/](\d{1,2})[-\/](\d{2,4})/
        year,month,day = $3.to_i,$1,$2
        date,*rest = str.split(' ')
        year += (year < 35 ? 2000 : 1900) if year < 100
        euro_parse("#{year}-#{month}-#{day} #{rest.join(' ')}",comp)
      else
        euro_parse(str,comp)
      end  
    end
  end
end
于 2013-11-15T16:16:49.063 に答える
0

適時性ジェムは、Rubyの日付/時刻の解析をよりカスタマイズ可能にし、Rails とうまく統合します。

あなたは Rails で作業しているので、同じ人物によるvalidates_timelinessプロジェクトも必ずチェックしてください。これには、すべての適時性に加えて、ActiveModel の洗練された日付/時刻検証メソッドが含まれています。

于 2013-03-20T18:54:44.740 に答える