を使用すると、 with 、および属性がselect_date
返されます。Date オブジェクトを簡単に取得するにはどうすればよいですか? のようなものを期待しています。params[:my_date]
year
month
day
params[:my_date].to_date
date_select
私も代わりに使ってよかったです。
を使用すると、 with 、および属性がselect_date
返されます。Date オブジェクトを簡単に取得するにはどうすればよいですか? のようなものを期待しています。params[:my_date]
year
month
day
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]
ます。
ここに別のものがあります
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 の回答では、日付フィールドが呼び出されていると仮定して、私が使用する「ワンライナー」を次に示します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})
または単にこれを行います:
your_date_var = Time.parse(params[:my_date])