domingo, 9 de agosto de 2009

Saber, dentro de um helper, o nome da view que o invocou

Esses dias eu estava querendo criar um helper para me ajudar com o I18n (Internationalization) da minha aplicação.

O problema é que dentro desse helper, eu precisava saber o nome da view que o invocou.

Geralmente nós usamos params[:controller] e params[:action] para saber o nome do controller e da action, respectivamente. Para saber o nome da view, as vezes é usado a constante __FILE__, mas nesse caso ela não ajuda porque se você usá-la dentro de um helper ela te retornará o nome do arquivo do helper, e não da view que o invocou.

Postei a pergunta no grupo da rails-br e o Rafael Rosa descobriu a solução pra mim (através desse link). Para conseguir o nome da view, você pode usar um desses métodos:

@template.template.relative_path
@template.template.base_path
@template.template.filename
@template.template.path_without_format_and_extension
@template.template.path_without_extension
@template.template.source


Acredito que os nomes são auto explicativos.

Como a dica foi útil para mim, resolvi publicar aqui para caso mais alguém estiver com esse problema.

Abraços, e até o próximo post!

sábado, 8 de agosto de 2009

Indentar linhas no VIM

Há alguns meses escolhi o vim como meu editor de textos para trabalhar com Rails. Ainda sou um usuário novo de vim, e sempre acabo aprendendo um ou outro comando novo com ele.

Nunca soube como fazer para indentar as linhas nele, aí hoje tomei vergonha na cara e fui procurar no google um comando para isso. O comando é muito simples, e também muito útil.

Para indentar uma linha, basta posicionar o cursor sobre a linha desejada, em modo de comando (ESC) digitar:

==

Se você quer, por exemplo, indentar as próximas 5 linhas, pode usar:

5=

Ou o número de linhas que desejar.

Com == e 5= ele indenta de acordo com o código e a indentação anterior.

Se você deseja simplesmente indentar a linha atual pra frente ou para trás, independente de código, pode usar também:

>>

e

<<

Bom é isso pessoal, espero que a dica ajude.

Pretendo fazer um post depois sobre os comandos que mais utilizo no vim. Se você indenta no vim de algum outra forma, ou se tem algum comando que você usa com frequência e acha útil fique a vontade para postar um comentário e contribuir com o post.

Abraços!

quarta-feira, 5 de agosto de 2009

Enviar parâmetros para um partial

Essa é uma dica simples, mas que tem sua utilidade.

O método render :partial recebe um hash com o nome locals. O conteúdo desse hash é disponibilizado dentro do partial como variáveis locais.

Por exemplo:

<%= render :partial => 'example', :locals => {:name => 'Bruno'} %>

Nesse caso estou passando uma variável name com o valor "Bruno" para o partial example.

Mas qual é a utilidade disso?

Vou dar um exemplo prático que aconteceu comigo esses dias.

Minha aplicação tem um model User e, ao criar as views para manipular esse model, percebi que o formulário da view new e o da view edit eram idênticos. Então nada melhor do que colocar esse conteúdo dentro de um partial e reaproveitar o código ao bom e velho estilo DRY (Don't Repeat Yourself).

Fiz isso e meu partial ficou próximo ao do exemplo (clique na imagem para ampliar):



A partir daí eu renderizei esse partial nas duas views (new e edit).

Só que depois de um tempo eu resolvi retirar alguns campos da view de cadastramento (new) para poder tornar o cadastro mais rápido, atraindo mais usuários. Para isso eu removi os campos name e last_name.

Uma vez que agora as views new e edit são diferentes, eu só posso manter no partial o que é comum às duas, então mantive no partial apenas a parte interna do formulário, com exceção dos campos mencionados. O partial ficou assim:



E para renderizar esse partial, eu deixei a view como de costume (render :partial):



O problema é que, o objeto "f" que é passado ao bloco do helper form_for está sendo criado na view e não existe dentro do partial. Quando o partial tentar acessar o "f" retornará um erro dizendo "undefined local variable or method `f'".

Para resolver esse problema, eu vou enviar para o partial o objeto "f", para que ele exista em seu escopo e solucione o meu problema.

Resultado (linha 4):



Problema resolvido!

É isso aí pessoal, espero que a dica ajude alguém que esteja com esse problema, ou pelo menos incentive o reaproveitamento de código nas views.

Abraços e até o próximo post!

domingo, 2 de agosto de 2009

Definir o timezone de seu projeto Rails

Se você criar um projeto rails aqui no Brasil e não definir o timezone, perceberá que as horas estarão sendo exibidas de forma errada.

Isso acontece porque a partir da versão 2.1 o Rails corrige as horas para o timezone UTC por padrão.

O timezone é definido no arquivo config/environment.rb, você encontrará a seguinte linha nesse arquivo:

config.time_zone = 'UTC'

Para saber qual é a nomenclatura do timezone da sua região você pode utilizar o comando:

rake time:zones:local

No meu caso, o resultado é:

* UTC -03:00 *
Brasilia
Buenos Aires
Georgetown
Greenland


E a opção que mais se enquadra para mim é "Brasilia", então irei alterar a linha de meu environment.rb para:

config.time_zone = 'Brasilia'

Agora basta reiniciar o servidor e as horas estarão sendo exibidas da forma correta para a minha região.

Abraços.

Criar atalhos para seus comandos no Ubuntu

Já que é pra falar de Linux, aí vai mais uma dica rápida.

Se você tem comandos extensos que utiliza com frequência, você pode simplificar sua vida criando atalhos (alias) para esses comandos.

Por exemplo, eu acho os comandos pra ligar e desligar o servidor mongrel um tanto quanto extensos para digitar várias vezes ao dia:

mongrel_rails start -d
mongrel_rails stop


Então para me ajudar eu criei alguns alias no arquivo .bashrc que me permitem acessar esses comandos apenas digitando:

mstart
mstop


Como fazer isso?

Simples, abra o arquivo .bashrc com o comando:

gedit ~/.bashrc

(utilizei o gedit porque acho que é um editor acessível a todos, mas você pode usar o que achar melhor)

Insira no final do arquivo as linhas e salve-o:

alias mstart="mongrel_rails start -d"
alias mstop="mongrel_rails stop"


A sintaxe é simples:

alias nome_do_atalho="comando"

E a partir daí você pode começar a usar comandos mais curtos!

Acredito que você precise reiniciar o micro pra começar a funcionar.

Essa dica foi para Ubuntu mas funciona em outras distribuições do Linux, o que muda as vezes é o nome do arquivo.

Abraços e até o próximo post!

Procurar arquivos no Linux a partir de um trecho de texto contido nele

Hoje darei uma dica sobre Linux que pode ser bem útil em seu dia a dia.

Vamos dizer que você escreveu um texto em um arquivo certo tempo atrás e hoje você lembra o que tem escrito nele mas não lembra o nome do arquivo. Ou vamos dizer que você alterou o nome de um método em seu projeto e precisa alterar todos os arquivos que usam o método com o nome antigo. Como encontrar esses arquivos?

Para procurar arquivos em um diretório a partir de um trecho contido dentro do dele existe o comando grep.

Por exemplo, vamos dizer que eu queira encontrar todos os arquivos que contém o trecho de texto "user" dentro do diretório atual.

Eu usaria:

grep "user" *

A sintaxe é "grep opções texto arquivo"

Eu posso usar também:

grep -Ri "user" *

O "R" diz pra ele procurar também em subpastas e o "i" diz pra ele não diferenciar maiúsculas de minúsculas.

Poderia melhorar utilizando:

grep -Rin "user" *

Com a opção "n" ele me retornaria também o número da linha em que o texto foi encontrado.

O grep pode ser usado também para filtrar o resultado de um outro comando, por exemplo:

lspci | grep "nVidia"

As aspas são opcionais para textos de uma palavra só.

Espero que a dica ajude. Na verdade eu estava tentando encontrar um arquivo que continha um trecho de código em meu projeto e o Vinícius Baggio me ensinou como fazer (obrigado!). Aí como achei bem útil resolvi vir aqui e passar a informação adiante.

Abraços.