¿Cómo obtener una fecha de date_select o select_date en Rails?

Usar select_date me devuelve un params[:my_date] con atributos de year , month y day . ¿Cómo obtener un objeto Date fácilmente? Espero algo como params[:my_date].to_date .

También me complace usar date_select en date_select lugar.

Usar date_select le proporciona 3 pares clave / valor separados para el día, mes y año, respectivamente. Entonces puede pasarlos a Date.new como parámetros para crear un nuevo objeto Date.

Un ejemplo date_select params devueltos para un modelo de Event :

 "event"=> {"name"=>"Birthday", "date(1i)"=>"2012", "date(2i)"=>"11", "date(3i)"=>"28"}, 

Luego, para crear el nuevo objeto Date :

 event = params[:event] date = Date.new event["date(1i)"].to_i, event["date(2i)"].to_i, event["date(3i)"].to_i 

En su lugar, puede decidir ajustar esta lógica en un método:

 def flatten_date_array hash %w(1 2 3).map { |e| hash["date(#{e}i)"].to_i } end 

Y luego date = Date.new *flatten_date_array params[:event] como date = Date.new *flatten_date_array params[:event] . Pero esta no es la lógica que realmente pertenece a un controlador, por lo que puede decidir moverla a otro lugar. Incluso podría extender esto en la clase Date y llamarlo como date = Date.new_from_hash params[:event] .

Aquí hay otro:

 # view < %= date_select('event', 'date') %> # controller date = Date.civil(*params[:event].sort.map(&:last).map(&:to_i)) 

Se encuentra en http://kevinlochner.com/use-rails-dateselect-without-an-activerecord

Aquí está el otro

 Date.civil(params[:event]["date(1i)"].to_i,params[:event]["date(2i)"].to_i,params[:event]["date(3i)"].to_i) 

Aquí hay otro para 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 

Debe incluirlo en su controlador o application_controller.rb:

 class ApplicationController < ActionController::Base include Convert end 

Con la respuesta date_select example @ joofsh, aquí hay un “un trazador de líneas” que utilizo, suponiendo que el campo de la fecha se llame 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}) 

Utilizo el siguiente método, que tiene los siguientes beneficios:

  1. no tiene que nombrar explícitamente las claves param xxx(1i) a xxx(3i) (y, por lo tanto, podría modificarse para capturar horas y minutos simplemente cambiando la Date por DateTime ); y
  2. extrae una fecha de un conjunto de params incluso cuando esos parámetros están ocupados con muchos otros pares clave-valor.

params es un hash del formato { xxx(1i): '2017', xxx(2i): 12, xxx(3i): 31, ... } ; date_key es la subcadena común xxx de los parámetros de fecha objective.

 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 

Elegí colocar esto como un método de clase de ApplicationRecord , en lugar de como un método auxiliar de instancias de ApplicationController . Mi razonamiento es que existe una lógica similar dentro del Model.new ActiveRecord ( es decir, Model.new ) para analizar las fechas pasadas desde los formularios de Rails.

O simplemente haz esto:

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