ruby-on-rails - tag - select rails helper
¿Cómo obtener una fecha de date_select o select_date en Rails? (7)
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.
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
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
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})
O simplemente haz esto:
your_date_var = Time.parse(params[:my_date])
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]
.
Utilizo el siguiente método, que tiene los siguientes beneficios:
- no tiene que nombrar explícitamente las claves param
xxx(1i)
axxx(3i)
(y, por lo tanto, podría modificarse para capturar horas y minutos simplemente cambiando laDate
porDateTime
); y - 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 objetivo.
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.