select_date
を使用すると、year
、month
、およびday
属性を持つparams[:my_date]
が返されます。 Dateオブジェクトを簡単に取得するにはどうすればよいですか? params[:my_date].to_date
のようなものを期待しています。
代わりにdate_select
も使用できてうれしいです。
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]
として呼び出すこともできます。
ここに別のものがあります:
# 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 で見つかりました
ここにもう一つあります
Date.civil(params[:event]["date(1i)"].to_i,params[:event]["date(2i)"].to_i,params[:event]["date(3i)"].to_i)
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
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})
私は次の方法を使用しますが、これには次の利点があります。
xxx(1i)
からxxx(3i)
まで明示的に名前を付ける必要はありません(したがって、Date
をDateTime
);そして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。)から渡された日付を解析します。