10

別の日付と時刻のフィールドに日時を変換しますかRailsの4 - ?どのようにあなただけの(1)日付のみ、(2)時間、2つのフォームフィールドにMySQLの日時フィールドを変換することができ、および提出フォームに戻っ日時形式に両方のフィールドを組み合わせ

これは、次の宝石の使用を許可しますが、単一のdatetimeフィールドに日付を格納します:

gem 'bootstrap-datepicker-rails' 
gem 'bootstrap-timepicker-rails' 

感謝を事前に!

答えて

15

は@Althaf

からの助けを借りて解決策が戻っ日時に変換することbefore_saveコールバックを使用しmodel.rb に仮想属性を追加しましたが見つかりました。

before_save :convert_to_datetime 

def sched_date_field 
    sched_date.strftime("%d/%m/%Y") if sched_date.present? 
end 

def sched_time_field 
    sched_time.strftime("%I:%M%p") if sched_time.present? 
end 

def sched_date_field=(date) 
    # Change back to datetime friendly format 
    @sched_date_field = Date.parse(date).strftime("%Y-%m-%d") 
end 

def sched_time_field=(time) 
    # Change back to datetime friendly format 
    @sched_time_field = Time.parse(time).strftime("%H:%M:%S") 
end 

def convert_to_datetime 
    self.sched_time = DateTime.parse("#{@sched_date_field} #{@sched_time_field}") 
end 

使用して、レール4は、controller.rbに厳しいのparamsにsched_date_fieldとsched_time_fieldを追加する必要がここ

_form.html.erbにフィールドです

<%= f.label :sched_date_field, "Scheduled Date" %> 
<%= f.text_field :sched_date_field, :class => "datepicker" %> 

<%= f.label :sched_time_field, "Scheduled Time" %> 
<%= f.text_field :sched_time_field, :class => "timepicker" %> 
+0

strict paramsでは、 "strong params"を意味しますか?また、このコードはsched_timeに未定義の変数エラーを発生させるようです。 –

+2

これはちょっとした問題ですが、この手法を使用し、 'sched_time'フィールドで検証が必要な場合は失敗します。 'before_save'を' before_validation'に変更することができます。しかし、カスケード検証がある場合は、これも失敗する可能性があります。この短いコメントで説明するのは少し難しいですが、私を信じて、それは失敗します。 – Karl

+0

@Karl代わりに何をお勧めしますか?私はこの問題に遭遇しています..データモデルを変更して日付、時刻、タイムゾーンを3つの別々のフィールドに格納することを考えています。 – Turgs

4

あなたがプロのサブスクリプションthe revised oneを持っている場合は、仮想属性See this Railscastとを使用することができます。基本的にはビューで次のでしょう

<%= f.label :date_field %> 
<%= f.text :date_field %> 
<%= f.label :time_field %> 
<%= f.text :time_field %> 

まだあなたが上記のように2つのフィールドを定義しなければならない、私はあなたのモデルに今full_date

と呼ぶことにしますフィールドを続けるだろうあなたのデータベース続く。

def date_field # What this returns will be what is shown in the field 
    full_date.strftime("%m-%d'%y") if full_date.present? 
end 

def time_field 
    full_date.strftime("%I:%M%p") if full_date.present? 
end 

def time_field=(time) 
    full_date = DateTime.parse("#{date_field} #{time_field}) 
end 

あなたがRailsの4を使用しているように見えるので、あなたはあなたの強いパラメータでDATE_FIELDとtime_fieldを許可する必要があります。

+0

私は、これはそれを行うための方法だろうと思いました。私はあなたのソリューションにいくつかのものを加えて、それを動作させる必要がありました。 – jverban

+0

は、あなたはので、私はあなたがそう他の人が後で –

+0

Could'tが、私は以下のソリューションを投稿して、この返信コメント領域で適切に解決策をフォーマットする方法をうまくそれを参照することができることをやったと私の答えを編集することができます変更何言及でした。ご協力いただきありがとうございます。 – jverban

6

ます

class MyModel < ActiveRecord::Base 
    include DateTimeAttribute 

    date_time_attribute :scheduled_at 
end 
date_time_attribute gemを使用することができます3210

それはあなたが別途schedule_at_datescheduled_at_timeを設定することができます。属性が設定されると、値はschedule_atに結合されます。

関連する問題