Oxente Rails
11 de Agosto de 2009, 0:00 - sem comentários aindaNesse fim de semana estive em Natal para participar do Oxente Rails. Voltei de lá muito feliz, não só por ter ouvido de perto vários feras falando um monte sobre Ruby, Rails, desenvolvimento ágil e empreendedorismo mas também por ter conhecido uma turma legal e super acolhedora.
Parabéns aos organizadores pelo evento, para o Elomar, que apesar da pouca idade fez um trabalho de gigantes (e também por ter um irmão tão precoce e esperto); para o Paulo Fagiani que ajudou aqueles que ainda não entendem inglês, como eu, fazendo as traduções; para a galera do Rio (Henrique Bastos, Rafael Lima, Silvestre Mergulhão, Tapajós) que movimentou a conferência e conseguiu aproximar todos nas horas-extra; para os natalenses, pela bela cidade e por nos ter recebido muito bem; para todos os palestrantes, incluindo os da desconferência, que compartilharam conhecimentos e experiências valiosas; para Fábio Akita por ser o cara que começou tudo isso aqui no Brasil; e para todas as pessoas que participaram e fizeram o Oxente Rails ser tão maravilhoso como foi.
Um abraços grande a todos, no ano que vem estarei lá novamente.
Resource Controller with Views
31 de Julho de 2009, 0:00 - sem comentários aindaUma das vantagens em usar o padrão REST é que os controllers da aplicação ficam padronizados. Isso permite que criemos classes base ou outras formas de não repetirmos o código quando estamos desenvolvendo um novo controller em uma aplicação Web.
Resource Controller
O resource_controller é um plugin para o Rails que oferece exatamente isso: a implementação das actions para um controllers RESTful.
Com ele, um controller como aquele que você já deve ter gerado com o gerador de scaffold padrão do Rails se resume a basicamente isso:
class UsersController < ResourceController::Base end
Mas o plugin não só fornece essa classe base com as actions implementadas, como também um bocado de forma de customizá-las, como por exemplo, criar alterar as mensagens de flash, o tipo de view que a action responderá, criar recursos aninhados, filtros, etc... tudo que você pode encontrar no README do projeto. (Adoro esses projetos que bastam uma página de documentação.)
Sendo assim, fica faltando somente as views...
Views
Depois de criar, recriar e renomear o projeto umas quinnhentas vezes, resolvi simplesmente fazer um fork do resource_controller e acrescentar a funcionalidade que eu gostaria: fornecer um conjunto de views básicas, como aquelas geradas pelo scaffold padrão, e uma forma simples de personalizá-las. (Afinal de contas, quem sabe o James Golick não aceita essas mudanças. ).
Quando você instala o resource_controller_with_views, ele cria o diretório app/views/scaffold com os templates para as views do controller. Além dos nomes (index, new, edit, show, _form), também preferi manter o conteúdo das views semelhante ao do scaffold padrão. Isso faz com que os usuários se sintam mais familiarizados com elas e, consequentemente, mais fácil de personalizá-las.
Personalização
Para alterar os templates você pode mexer à vontade nos arquivos do app/views/scaffold
. Se você quiser alterar uma view de um controller, você pode copiar desse mesmo diretório ou criá-la do zero.
Entretanto, depois de estabelecido como vão ser as views do scaffold, nós queremos muitas vezes apenas informar como um campo deve ser exibido ou que campos devem aparecer em cada tela do scaffold.
Para facilitar esse tipo de customização mais pontual você pode criar métodos no helper do controller, como o seguinte exemplo:
module UsersHelper include ResourceController::Helper def columns ['login', 'name'] end end
Depois de incluir no helper o módulo ResourceController::Helper
, você poderá usar alguns métodos mágicos.
O método columns
será usado para definir quais colunas serão utilizadas no scaffold, ou seja, em todas as views do controller Users
exibirão apenas os campos login
e name
.
Para especificar os campos apenas para action index
, defina o método index_columns
; para os campos da action show
defina show_columns
; e para as actions new
e edit
defina form_columns
.
Um dica: se você quiser aproveitar a configuração padrão para remover ou alterar alguns campos, você pode usar o super
e os operadores +
e -
do Array
:
module UsersHelper include ResourceController::Helper def columns ['login', 'name'] end def form_columns super + %(password password_confirmation) end end
Existe também um atalho para esses métodos:
module UsersHelper include ResourceController::Helper columns :login, :name form_columns :login, :name, :password, :password_confirmation end
Para definir como um campo deve aparecer, nas views index
e show
basta definir um método <nome_da_coluna>_column
. E para definir como ele deve aparecer no formulário, defina um método <nome_da_coluna>_form_column
. Crédito para o ActiveScaffold pela bela sacada.
module UsersHelper include ResourceController::Helper def website_column(user) autolink user.website end def about_form_column(form, user) form.textarea 'about', :rows => 3 end def level_id_form_column(form, user) form.select 'level_id', Level.all.collect {|l| [l.description, l.id ]}, { :include_blank => true }) end end
Também tempos alguns atalhos para isso:
module UsersHelper include ResourceController::Helper password_field :password password_field :password_confirmation textarea :about, :rows => 3 select :level_id, Level.all.collect {|l| [l.description, l.id ]}, :include_blank => true end
Você pode usar essas macros para todos os métodos do FormHelper, exceto para os métodos form_for
e fields_for
.
Pronto, é só isso que esse _with_views trouxe de novidade ao resource_controller. E se você tiver alguma sugestão para esse projeto, por favor a faça.
Pós instalação do SQL*Plus
3 de Julho de 2009, 0:00 - sem comentários aindaJá faz quase dois anos que estamos desenvolvendo aplicações com o Oracle na Credishop e eu ainda não tinha parado pra tentar melhorar algumas coisinhas na instalação padrão do SQL*Plus (a ferramenta de linha de comandos do Oracle) que irritam um pouco a gente.
“E porque não usar uma ferramenta visual como o SQL Developer?” Claro que nós usamos, mas às vezes abrir o terminal e executar o comando é bem mais prático que abrir uma ferramenta gráfica, escolher a conexão e executar o comando.
A primeira dica é instalar o rlwrap
para permitir que a gente use as maravilhosas setinha do teclado (rsrs) e o veja o histórico de comandos quando teclar pra cima.
$ sudo apt-get install rlwrap
Agora vamos criar um alias para sempre que chamarmos pelo sqlplus, usarmos ele junto com o rlwrap:
$ alias sqlplus="rlwrap sqlplus"
A segunda coisa a fazer é configurar o ambiente para que o sqlplus use o vim para a edição de queries.
$ export EDITOR=/usr/bin/vim
Assim, você poderá usar o comando edit
, ou simplesmente ed
, para ele abrir a última consulta executada ou abrir um arquivo, como por exemplo:
SQL> ed consulta_conta
Para terminar, adicione esses dois comandos, o alias
e o export
, no seu arquivo ~/.bashrc
.
rm -rf *
25 de Junho de 2009, 0:00 - sem comentários aindaOntem de madrugada eu estava configurando umas coisas no meu servidor, e acabei fazendo uma grande besteira: apaguei tudo que tinha lá, inclusive esse blog. Eu pensava que estava numa pasta temporária e larguei um rm -rf *
, mas infelizmente era o meu home.
Ainda bem que a única coisa que tinha “no ar” era esse blog. Então foi só baixar e instalar o Wordpress novamente. Perdi o tema e alguns plugins, mas como quero mudar a cara do blog, por enquanto vou deixá-lo assim mesmo.
Agora vou criar um script pra backupear tanto a instalação do Wordpress quanto o banco de dados já que meu plano basicão da Locaweb não oferece isso.
Descobrindo métodos de um objeto no irb
16 de Junho de 2009, 0:00 - sem comentários aindaÀs vezes queremos lembrar de um método de um objeto enquanto estamos numa sessão do irb ou do console do Rails.
Autocomplete
A primeira dica é usando o autocomplete no terminal. Para isso basta carregar a biblioteca irb/completion:
irb(main):001:0> require 'irb/completion' >> true irb(main):002:0> 8.s 8.send 8.singleton_method_added 8.singleton_methods 8.size 8.step 8.succ
Quando eu digitei “8.s” e teclei Tab duas vezes, ele me trouxe os métodos do objeto 8 que começam com ’s’.
Por padrão o console do Rails já vem com esse recurso habilitado. Mas se você quiser usá-lo sempre que abrir uma sessão do irb, adicione esse require no arquivo .irbrc
em seu diretório home.
Métodos que não são comuns
Tem outra forma simples que aqui-acolá me quebra o galho. Eu uso quando quero não lembro nem do começo do método.
No terminal, faça o seguinte:
irb(main):003:0> 8.methods - methods => ["%", "<<", "singleton_method_added", "gcd", "&", ">>", "round", "to_r", "divmod", "integer?", "chr", "*", "+", "to_i", "rdiv", "-", "upto", "between?", "prec", "truncate", "/", "numerator", "modulo", "succ", "|", "zero?", "~", "to_f", "rpower", "prec_i", "step", "to_int", "^", "remainder", "+@", "nonzero?", "-@", "**", "floor", "<", "<=>", "prec_f", "quo", ">", "downto", "id2name", "size", "abs", "lcm", ">=", "power!", "next", "<=", "coerce", "ceil", "div", "denominator", "times", "to_sym", "[]", "gcdlcm"]
Ele retorna uma array com todos os métodos do objeto 8 que não fazem parte de Object. Se eu fizesse apenas 8.methods ele traria um monte de métodos que provavelmente não me interessariam, pois pertencem a todos os objetos.
Pesquisa
A última dica é filtrar os métodos usando um select e uma expressão regular com um trecho do método procurado:
irb(main):004:0> 8.methods.select {|m| m =~ /ator/ } => ["numerator", "denominator"]
É isso!