27

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

date_select私も代わりに使ってよかったです。

4

8 に答える 8

47

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]ます。

于 2012-11-28T14:08:54.320 に答える
3

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

Date.civil(params[:event]["date(1i)"].to_i,params[:event]["date(2i)"].to_i,params[:event]["date(3i)"].to_i)
于 2014-07-01T17:02:48.110 に答える
2

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
于 2016-10-30T10:30:42.897 に答える
1

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})
于 2015-10-03T20:15:47.013 に答える
-4

または単にこれを行います:

your_date_var = Time.parse(params[:my_date])
于 2017-01-04T18:13:53.880 に答える