복붙노트

[RUBY-ON-RAILS] 어떻게 레일에 date_select 또는 select_date에서 날짜를 얻으려면?

RUBY-ON-RAILS

어떻게 레일에 date_select 또는 select_date에서 날짜를 얻으려면?

년, 월, 일 속성을 : [my_date] select_date를 사용하는 것은 나를 PARAMS을 백업 할 수 있습니다. 어떻게 쉽게 Date 객체를받을 수 있나요? [: my_date] .to_date 나는 PARAMS 같은 뭔가를 바라고 있어요.

내가 대신뿐만 아니라 date_select 사용하는 것이 행복 해요.

해결법

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

    1.date_select를 사용하면 당신에게 각각 년, 월, 일 3 별도의 키 / 값 쌍을 제공합니다. 매개 변수는 새 Date 객체를 생성하기 위해 당신은 Date.new로 전달할 수 있습니다.

    date_select를 사용하면 당신에게 각각 년, 월, 일 3 별도의 키 / 값 쌍을 제공합니다. 매개 변수는 새 Date 객체를 생성하기 위해 당신은 Date.new로 전달할 수 있습니다.

    예제 date_select는 이벤트 모델 PARAMS을 반환

    "event"=>
     {"name"=>"Birthday",
      "date(1i)"=>"2012",
      "date(2i)"=>"11",
      "date(3i)"=>"28"},
    

    그런 다음 새 Date 객체를 생성합니다 :

    event = params[:event]
    date = Date.new event["date(1i)"].to_i, event["date(2i)"].to_i, event["date(3i)"].to_i
    

    대신하는 방법이 논리를 포장하기로 결정할 수도 있습니다 :

    def flatten_date_array hash
      %w(1 2 3).map { |e| hash["date(#{e}i)"].to_i }
    end
    

    [이벤트] 그리고 날짜로 = Date.new * flatten_date_array PARAMS를 호출. 그러나 이것은 당신이 다른 곳으로 이동하기로 결정할 수 있도록 진정, 컨트롤러에 속하는 논리는 아니다. [이벤트] 당신은 = Date.new_from_hash PARAMS을 Date 클래스에이 확장, 날짜로 호출 할 수 있습니다.

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

    2.여기에 또 다른 하나는 다음과 같습니다

    여기에 또 다른 하나는 다음과 같습니다

    # view
    <%= date_select('event', 'date') %>
    
    # controller
    date = Date.civil(*params[:event].sort.map(&:last).map(&:to_i))
    

    http://kevinlochner.com/use-rails-dateselect-without-an-activerecord에서 찾을 수

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

    3.여기에 또 다른 하나

    여기에 또 다른 하나

    Date.civil(params[:event]["date(1i)"].to_i,params[:event]["date(2i)"].to_i,params[:event]["date(3i)"].to_i)
    
  4. ==============================

    4.여기서 레일 5의 또 다른 하나는 :

    여기서 레일 5의 또 다른 하나는 :

    module Convert
      extend ActiveSupport::Concern
    
      included  do
        before_action :convert_date
      end
    
      protected
    
      def convert_date
        self.params = ActionController::Parameters.new(build_date(params.to_unsafe_h))
      end
    
      def build_date(params)
        return params.map{|e| build_date(e)} if  params.is_a? Array
    
        return params unless params.is_a? Hash
    
        params.reduce({}) do |hash, (key, value)|
          if result = (/(.*)\(\di\)\z/).match(key)
            params_name = result[1]
            date_params = (1..3).map do |index|
              params.delete("#{params_name}(#{index}i)").to_i
            end
            hash[params_name] =  Date.civil(*date_params)
          else
            hash[key] = build_date(value)
          end
    
          hash
        end
      end
    end
    

    당신은 당신의 컨트롤러 또는 application_controller.rb에 포함해야합니다 :

    class ApplicationController < ActionController::Base
      include Convert
    end
    
  5. ==============================

    5.joofsh의 대답 @ date_select 예로, 여기 시작일이라고 날짜 필드를 추정 "원 라이너"내가 사용은이다 :

    joofsh의 대답 @ date_select 예로, 여기 시작일이라고 날짜 필드를 추정 "원 라이너"내가 사용은이다 :

    ev_params = params[:event]
    
    date = Time.zone.local(*ev_params.select {|k,v| k.to_s.index('start_date(') == 0 }.sort.map {|p| p[1].to_i})
    
  6. ==============================

    6.나는 다음과 같은 이점이 있습니다 다음과 같은 방법을 사용합니다 :

    나는 다음과 같은 이점이 있습니다 다음과 같은 방법을 사용합니다 :

    PARAMS의 형식의 해시 { '2017', XXX (2I) : 12, XXX (3I) XXX (1I) (31), ...}; date_key 대상 날짜 매개 변수의 일반적인 문자열 XXX입니다.

    def date_from_params(params, date_key)
      date_keys = params.keys.select { |k| k.to_s.match?(date_key.to_s) }.sort
      date_array = params.values_at(*date_keys).map(&:to_i)
      Date.civil(*date_array)
    end
    

    나는 ApplicationRecord의 클래스 메소드보다는 같은와 ApplicationController의 인스턴스 도우미 방법으로이 문제를 배치하기로 결정했습니다. 내 논리는 유사한 논리가 레일 형태에서 전달 구문 분석 날짜에 액티브의 인스 (즉, Model.new) 내에 존재한다는 것입니다.

  7. ==============================

    7.또는 단순히이 작업을 수행 :

    또는 단순히이 작업을 수행 :

    your_date_var = Time.parse(params[:my_date])
    
  8. from https://stackoverflow.com/questions/13605598/how-to-get-a-date-from-date-select-or-select-date-in-rails by cc-by-sa and MIT license