web-dev-qa-db-ja.com

Railsのdate_selectまたはselect_dateから日付を取得する方法は?

select_dateを使用すると、yearmonth、およびday属性を持つparams[:my_date]が返されます。 Dateオブジェクトを簡単に取得するにはどうすればよいですか? params[:my_date].to_dateのようなものを期待しています。

代わりにdate_selectも使用できてうれしいです。

26
at.

Date_selectを使用すると、それぞれ日、月、年に対して3つの個別のキー/値ペアが得られます。そのため、それらをパラメーターとしてDate.newに渡して、新しいDateオブジェクトを作成できます。

Date_selectの例は、Eventモデルのパラメーターを返しました。

"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 = Date.new *flatten_date_array params[:event]として呼び出します。しかし、これは実際にコントローラーに属するロジックではないため、別の場所に移動することもできます。これをDateクラスに拡張し、date = Date.new_from_hash params[:event]として呼び出すこともできます。

47
joofsh

ここに別のものがあります:

# 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 で見つかりました

12
Vassilis

ここにもう一つあります

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

Rails 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
2
I0Result

Date_selectの例の@joofshの答えで、ここに私が使用する「1つのライナー」があります。日付フィールドはstart_date

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})
1
Radu Cugut

私は次の方法を使用しますが、これには次の利点があります。

  1. param keyにxxx(1i)からxxx(3i)まで明示的に名前を付ける必要はありません(したがって、DateDateTime);そして
  2. これらのパラメータに他の多くのキーと値のペアが入力されている場合でも、paramsのセットから日付を抽出します。

params{ xxx(1i): '2017', xxx(2i): 12, xxx(3i): 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のクラスメソッドとして配置することにしました。私の推論では、ActiveRecordインスタンシエーター内に同様のロジックが存在するということです(つまり、Model.new)Rails forms。)から渡された日付を解析します。

1
Ryan Lue