Rails e Jquery-ui Datepicker

#dev, #ruby

Instalar o jquery e jquery-ui

Baixar o jquery e o jquery-ui para o diretório public, mas se vc quiser pode usar a gem jquery-rails:

source "http://rubygems.org"

gem "rails", "3.0.9"
gem "jquery-rails"

gem "sqlite3"

Instalar:

$ bundle install

E adicionar o jquery:

$ rails g jquery:install --ui
  remove  public/javascripts/prototype.js
  remove  public/javascripts/effects.js
  remove  public/javascripts/dragdrop.js
  remove  public/javascripts/controls.js
 copying  jQuery (1.6.1)
  create  public/javascripts/jquery.js
  create  public/javascripts/jquery.min.js
 copying  jQuery UI (1.8.12)
  create  public/javascripts/jquery-ui.js
  create  public/javascripts/jquery-ui.min.js
 copying  jQuery UJS adapter (0e7426)
  remove  public/javascripts/rails.js
  create  public/javascripts/jquery_ujs.js

O model

$ rails g scaffold Aniversario nome:string dia:date

Nosso projeto já recebe datas, pelo método date_select, mas nos queremos que ou o usuário digite a data (separada por /) ou selecione no datapicker do jquery-ui uma.

Um fato interessante desta forma de inserir datas é que permite deixar a data vazia, algo que no padrão rails não consegui encontrar.

Primeiro: Receber a data como string

Vamos primeiro preparar o model e o formulário para inserir a data manualmente usando o text_field.

O primeiro passo é mudar a formulário de data_select para text_field:

Se você for criar algum registro desta forma a data será reconhecida de forma errada.

Então vamos preparar o model para receber a data em formato usado no Brasil.

class Aniversario < ActiveRecord::Base
  def dia_br
    "#{dia.to_s[8..9]}/#{dia.to_s[5..6]}/#{dia.to_s[0..3]}"
  end

  def dia_br=(dia_en)
    self.dia = "#{dia_en[6..9]}-#{dia_en[3..4]}-#{dia_en[0..1]}"
  end
end

Como pode-se notar nos não mudamos a forma padrão, nos apenas criamos um método auxiliar.

Continuando no form use, ao invés de dia, dia_br:

<div class="field">
  <%= f.label :dia %><br />
  <%= f.text_field :dia_br %>
</div>

Implementando o datapicker

Antes de colocar o datapicker vamos primeiro adicionar o locale dele, para isso basta baixar o arquivo jquery.ui.datepicker-pt-BR.js, colocar em public e adicionar usando javascript_include_tag:

<%= javascript_include_tag :defaults, "jquery.ui.datepicker-pt-BR" %>

Agora só falta usar o jquery-ui datapicker como manda a sua documentação:

<% javascript_tag do %>
  $(document).ready(function() {
    $('#aniversario_dia_br').datepicker();
  });
<% end %>

E para ficar mais bonito adicionar um tema.

Como de costume o projeto está no github: dmitrynix/rails-datepicker.