使用给了select_date我一个params[:my_date]withyear和属性。如何轻松获取 Date 对象?我希望有类似的东西。monthdayparams[:my_date].to_date
我也很乐意使用date_select。
使用给了select_date我一个params[:my_date]withyear和属性。如何轻松获取 Date 对象?我希望有类似的东西。monthdayparams[: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找到
我使用以下方法,它有以下好处:
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 实例化器 ( ie,  ) 中存在类似的逻辑Model.new来解析从 Rails 表单传入的日期。
这是另一个
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})
    Rails 5 + use select_date,在您看来请注意前缀
<%= select_date Date.today - 3.months, prefix: :start_date %>
然后在您的控制器中,您只需处理:
your_date = Date.civil(params[:start_date][:year].to_i, params[:start_date][:month].to_i, params[:start_date][:day].to_i)
前缀将三个日期组件绑定到一个对象中。
或者干脆这样做:
your_date_var = Time.parse(params[:my_date])