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:
xxx(1i)
a xxx(3i)
(y, por lo tanto, podría modificarse para capturar horas y minutos simplemente cambiando la Date
por DateTime
); y 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])