Pergunta

Como você iria sobre a produção de relatórios por usuário selecionado intervalos de datas em uma aplicação rails? Quais são as melhores selecionadores de intervalo de datas?

Editar em resposta a Patrick: Eu estou procurando um pouco de ambos widget e aconselhamento registro ativo, mas o que eu sou realmente curioso é como exibir restfully uma data lista variou com base em datas selecionadas pelo usuário.

Foi útil?

Solução

Estamos fazendo uma pergunta de interface aqui (ou seja, você quer um widget) ou uma pergunta ActiveRecord?

Date Picking Widgets

1) Padrão Rails Solução : Consulte a documentação date_select aqui .

2) Usar um plugin : Por que escrever código? Eu, pessoalmente, como o CalendarDateSelect plugin, usando um par de ventosas quando eu preciso de um intervalo.

3) Adaptar um Javascript widget para Rails : É quase trivial para integrar algo como a biblioteca Yahoo UI (YUI) calendário , que é tudo o Javascript, para Rails. Do ponto de vista do Rails é apenas outra maneira de preencher o params[:start_date] e params[:end_date]. YUI Calendário tem suporte nativo para intervalos.

Obtendo os dados dos Widgets

1) Padrão Rails Solução Consulte a documentação date_select aqui .

#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 :. Ao invés semelhante ao anterior, só que com mais sexy UI visível

3) Adaptar um Javascript Widget : Normalmente, isso significa que algum elemento formulário terá a entrada de data como uma string. Grande notícia para você, pois Date.parse é um pouco de magia sério. Os params [: some_form_element_name]. Será inicializado pelo Rails para você

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

Escrevendo a chamada para ActiveRecord

Fácil como torta.

  #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

Outras dicas

Não é uma prática unrestful ter parâmetros de URL controlar o intervalo de registros selecionados. Em sua ação de índice, você pode fazer o que Patrick sugeriu e ter esta:

  #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]])

Então, na sua opinião índice, criar um formulário que tachas em? Start_date = 2008-01-01 & end_date = 2008-12-31 ao URL. Lembre-se que de entrada fornecida pelo usuário, que deve ter cuidado com ele. Se você colocá-lo novamente na tela em sua ação de índice, certifique-se de fazê-lo como este:

Showing records starting on 
<%= h start_date %> 
and ending on 
<%= h end_date %>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top