如何从Rails中的date_select或select_date获取日期?

使用select_date会给我一个带有yearmonthday属性的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的答案,这里是我使用的“单行”,假设日期字段名为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. 它不必明确地命名param键xxx(1i)xxx(3i) (因此可以修改为仅通过将Date更改为DateTime来捕获小时和分钟); 和
  2. 它从一组params提取日期,即使这些参数填充了许多其他键值对。

params是格式为{ xxx(1i): '2017', xxx(2i): 12, xxx(3i): 31, ... }的散列{ 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的类方法,而不是作为ApplicationRecord的实例辅助方法。 我的理由是,ActiveRecord实例化器( Model.new )中存在类似的逻辑来解析从Rails表单传递的日期。

或者只是这样做:

 your_date_var = Time.parse(params[:my_date])