text_field tag select_tag rails number form ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 params

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



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:

  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 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.