Come ottenere una data da date_select o select_date in Rails?

L’utilizzo di select_date mi restituisce un params[:my_date] con params[:my_date] di year , month e day . Come si ottiene facilmente un object Date? Sto sperando in qualcosa di simile a params[:my_date].to_date .

Sono felice di utilizzare date_select al date_select posto.

L’utilizzo di date_select ti offre 3 coppie chiave / valore separate rispettivamente per il giorno, il mese e l’anno. Quindi puoi passarli in Date.new come parametri per creare un nuovo object Date.

Un esempio date_select ha restituito parametri per un modello di Event :

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

Quindi per creare il nuovo object Date :

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

Puoi decidere invece di racchiudere questa logica in un metodo:

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

E quindi chiamalo come date = Date.new *flatten_date_array params[:event] . Ma questa non è una logica che appartiene veramente a un controller, quindi puoi decidere di spostarlo altrove. Potresti persino estenderlo alla class Date e chiamarlo come date = Date.new_from_hash params[:event] .

Eccone un altro:

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

Trovato su http://kevinlochner.com/use-rails-dateselect-without-an-activerecord

Ecco l’altro

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

Ecco un altro per le rotaie 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 

Devi includerlo nel tuo controller o in application_controller.rb:

 class ApplicationController < ActionController::Base include Convert end 

Con l’esempio date_select @ joofsh’s, ecco un “one liner” che uso, supponendo che il campo data sia chiamato 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}) 

Io uso il seguente metodo, che ha i seguenti vantaggi:

  1. non deve nominare in modo esplicito le chiavi param xxx(1i) tramite xxx(3i) (e quindi potrebbe essere modificato per catturare ora e minuto semplicemente cambiando la Date in DateTime ); e
  2. estrae una data da un set di params anche quando quei parametri sono popolati con molte altre coppie chiave-valore.

params è un hash del formato { xxx(1i): '2017', xxx(2i): 12, xxx(3i): 31, ... } ; date_key è la sottostringa comune xxx dei parametri della data di destinazione.

 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 

Ho scelto di posizionarlo come metodo di class di ApplicationRecord , anziché come un metodo helper di istanza di ApplicationController . Il mio ragionamento è che esiste una logica simile all’interno dell’istanza di Model.new ( cioè, Model.new ) per analizzare le date trasmesse dai moduli Rails.

O semplicemente fai questo:

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