복붙노트

[RUBY-ON-RAILS] 레일 방법은 어디 그 DateTime 개체로`datetime_select`에서 변환 데이터?

RUBY-ON-RAILS

레일 방법은 어디 그 DateTime 개체로`datetime_select`에서 변환 데이터?

내가 사용하는 경우 <% = f.datetime_select : somedate %> 형태로, 그것은 생성 HTML과 같은 :

<select id="some_date_1i" name="somedate1(1i)">  #year
<select id="some_date_2i" name="somedate1(2i)">  #month
<select id="some_date_3i" name="somedate1(3i)">  #day
<select id="some_date_4i" name="somedate1(4i)">  #hour
<select id="some_date_5i" name="somedate1(5i)">  #minute

그 양식이 제출되면 somedate1 ( I)의 값이 수신된다 :

{"date1(1i)"=>"2011", "date1(2i)"=>"2", "date1(3i)"=>"21", "date1(4i)"=>"19", "date1(5i)"=>"25"}

어떻게 DateTime 개체로 그것을 변환 할 수 있습니까?

나는이 작업을 수행하는 내 자신의 방법을 쓸 수 있지만 레일부터 이미 내가 나를 위해 그것을 할 그 레일 메서드를 호출 할 수 있다면, 내가 궁금 변환을 할 수 있을까?

나는 어디에서 그 방법을 찾아하는 모른다.

내가 궁극적으로 해결하기 위해 노력하고있어 "POST 매개 변수에 날짜 / 시간을 처리하는 방법?" 이 문제는 다른 문제에 대한 해결책을 찾기 위해 노력하는 첫 번째 단계입니다.

해결법

  1. ==============================

    1.그 코드 경로의 시작은 바로 여기에 대해 것 같다 :

    그 코드 경로의 시작은 바로 여기에 대해 것 같다 :

    https://github.com/rails/rails/blob/d90b4e2/activerecord/lib/active_record/base.rb#L1811

    그것은 찾기 힘들했다! 나는 이것이 당신이 원하는 것을 찾는 도움이되기를 바랍니다

  2. ==============================

    2.당신이 당신의 모델을 저장할 때이 변환은 액티브 내에서 발생합니다.

    당신이 당신의 모델을 저장할 때이 변환은 액티브 내에서 발생합니다.

    이 같은으로 해결 할 수 :

    somedate = DateTime.new(params["date1(1i)"].to_i, 
                            params["date1(2i)"].to_i,
                            params["date1(3i)"].to_i,
                            params["date1(4i)"].to_i,
                            params["date1(5i)"].to_i)
    

    날짜 시간 :: 새로운 날짜 시간의 별칭 : 시민 (루비 문서)입니다

  3. ==============================

    3.안녕 나는하여와 ApplicationController에 다음을 추가하고,이 변환을 수행합니다.

    안녕 나는하여와 ApplicationController에 다음을 추가하고,이 변환을 수행합니다.

        #extract a datetime object from params, useful for receiving datetime_select attributes
        #out of any activemodel
        def parse_datetime_params params, label, utc_or_local = :local
          begin
            year   = params[(label.to_s + '(1i)').to_sym].to_i
            month  = params[(label.to_s + '(2i)').to_sym].to_i
            mday   = params[(label.to_s + '(3i)').to_sym].to_i
            hour   = (params[(label.to_s + '(4i)').to_sym] || 0).to_i
            minute = (params[(label.to_s + '(5i)').to_sym] || 0).to_i
            second = (params[(label.to_s + '(6i)').to_sym] || 0).to_i
    
            return DateTime.civil_from_format(utc_or_local,year,month,mday,hour,minute,second)
          rescue => e
            return nil
          end
        end
    
  4. ==============================

    4.다른 사람이 여기 DateTime.new를 사용하는 솔루션을 제공,하지만 PostgreSQL을에서 작동하지 않습니다. 즉, 그대로는 형태로 삽입으로 즉, 레코드를 저장합니다, 당신은 "시간대없이 타임 스탬프"를 사용하는 경우에 따라서는, UTC 시간으로 데이터베이스에 저장하지 않습니다. 나는이 일을 알아 내려고 시간을 보냈다 및 솔루션 DateTime.new보다는 Time.new를 사용하는 것이 었습니다 :

    다른 사람이 여기 DateTime.new를 사용하는 솔루션을 제공,하지만 PostgreSQL을에서 작동하지 않습니다. 즉, 그대로는 형태로 삽입으로 즉, 레코드를 저장합니다, 당신은 "시간대없이 타임 스탬프"를 사용하는 경우에 따라서는, UTC 시간으로 데이터베이스에 저장하지 않습니다. 나는이 일을 알아 내려고 시간을 보냈다 및 솔루션 DateTime.new보다는 Time.new를 사용하는 것이 었습니다 :

    datetime = Time.new(params["fuel_date(1i)"].to_i, params["fuel_date(2i)"].to_i, 
                            params["fuel_date(3i)"].to_i, params["fuel_date(4i)"].to_i,
                            params["fuel_date(5i)"].to_i)
    
  5. ==============================

    5.매우 비슷한 일을했고,이 방법을 사용하여 결국 :

    매우 비슷한 일을했고,이 방법을 사용하여 결국 :

    def time_value(hash, field)
      Time.zone.local(*(1..5).map { |i| hash["#{field}(#{i}i)"] })
    end
    
    time = time_value(params, 'start_time')
    

    참조 : TimeZone.local를

  6. ==============================

    6.나는 내가 내 컨트롤러에 PARAMS을 허용 추가하는 것을 잊었다 밝혀졌다 4. 레일이 문제를 가지고 있었다 :

    나는 내가 내 컨트롤러에 PARAMS을 허용 추가하는 것을 잊었다 밝혀졌다 4. 레일이 문제를 가지고 있었다 :

    def event_params
      params.require(:event).permit(....., :start_time, :end_time,...)
    end
    
  7. ==============================

    7.이 메소드 I 사용 - 그것은 새로운 해시로 삭제 된 키를 반환합니다.

    이 메소드 I 사용 - 그것은 새로운 해시로 삭제 된 키를 반환합니다.

    class Hash
       def delete_by_keys(*keys)
         keys.each_with_object({}) { |k, h| h[k] = delete(k) if include? k }
      end
    end
    
  8. from https://stackoverflow.com/questions/5073756/where-is-the-rails-method-that-converts-data-from-datetime-select-into-a-datet by cc-by-sa and MIT license