Question

Comment feriez-vous pour produire des rapports selon des plages de dates sélectionnées par l'utilisateur dans une application rails? Quels sont les meilleurs sélecteurs de dates?

éditer en réponse à patrick: Je cherche un peu à la fois un widget et un conseil d’enregistrement actif, mais ce qui m’intéresse vraiment, c’est d’afficher de manière reposante une liste de plages de dates en fonction des dates sélectionnées par l’utilisateur.

Était-ce utile?

La solution

Demandons-nous une question d'interface ici (c'est-à-dire que vous voulez un widget) ou une question d'ActiveRecord?

Widgets de sélection de date

1) Solution Rails par défaut : voir la documentation sur date_select ici .

2) Utiliser un plugin : Pourquoi écrire du code? Personnellement, j'aime bien le plug-in CalendarDateSelect , qui utilise une paire de ventouses lorsque j'ai besoin d'une plage.

3) Adapter un widget Javascript à Rails : il est presque trivial d'intégrer quelque chose comme la bibliothèque Yahoo UI (YUI) Agenda , qui est tout Javascript, à Rails. Du point de vue de Rails, c’est une autre manière de renseigner les params [: date_début] et les params [: date_fin] . YUI Calendar prend en charge les plages de manière native.

Récupération des données à partir des widgets

1) Solution Rails par défaut Voir la documentation sur date_select ici .

#an application helper method you'll find helpful
#credit to http://blog.zerosum.org/2007/5/9/deconstructing-date_select

# Reconstruct a date object from date_select helper form params
def build_date_from_params(field_name, params)
  Date.new(params["#{field_name.to_s}(1i)"].to_i, 
       params["#{field_name.to_s}(2i)"].to_i, 
       params["#{field_name.to_s}(3i)"].to_i)
end

#goes into view
<%= date_select "report", "start_date", ... %>
<%= date_select "report", "end_date", ... %>    

#goes into controller -- add your own error handling/defaults, please!
report_start_date = build_date_from_params("start_date", params[:report])
report_end_date = build_date_from_params("end_date", params[:report])    

2) CalendarDateSelect : assez similaire à ce qui précède, avec une interface utilisateur visible plus sexy.

3) Adapter un widget Javascript : cela signifie généralement qu'un élément de formulaire aura la date saisie sous forme de chaîne. Bonne nouvelle pour vous, car Date.parse est une véritable magie. Les params [: some_form_formement_name] seront initialisés par Rails pour vous.

#goes in controller.  Please handle errors yourself -- Javascript != trusted input.
report_start_date = Date.parse(params[:report_start_date])

Écrire l'appel à ActiveRecord

Facile comme bonjour.

  #initialize start_date and end_date up here, by pulling from params probably
  @models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?',
    start_date, end_date])
  #do something with models

Autres conseils

Ce n’est pas une pratique anodine que les paramètres d’URL contrôlent la plage des enregistrements sélectionnés. Dans votre action d'index, vous pouvez faire ce que Patrick a suggéré et avoir ceci:

  #initialize start_date and end_date up here, by pulling from params probably
  @models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?', params[:start_date], params[:end_date]])

Ensuite, dans votre vue d'index, créez un formulaire qui pointe? start_date = 2008-01-01 & amp_end_date = 2008-12-31 sur l'URL. Rappelez-vous que c'est une entrée fournie par l'utilisateur, alors soyez prudent avec elle. Si vous le remettez à l'écran dans votre action d'indexation, veillez à le faire comme suit:

Showing records starting on 
<%= h start_date %> 
and ending on 
<%= h end_date %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top