Tagview Tecnologia

    Soluções web

    Browsing Posts published by Daniel Teixeira

    Algo que eu sempre me esqueço quando vou configurar uma nova máquina são as configurações do ~/.gitconfig. Dentre elas:

    [core]
      excludesfile = /home/daniel/global-gitignore

    Essa configuração faz com que o arquivo /home/daniel/global-gitignore funcione como o .gitignore mas para todos os repositórios git, sendo um adicional ao eventual .gitignore do seu projeto.

    [push]
      default = tracking

    Define que, por default, o comando git push faça push na branch “trackada

    [alias]
      co = checkout
      st = status
      ci = commit

    Aliases essenciais que substituem os git checkout minha-branch por git co minha-branch e etc.

    Um método bem interessante do rails é o returning. Apesar de ser bem simples, ele ajuda a manter seu código mais limpo e mais fácil de entender (depois de pegar costume :P ).
    Funciona mais ou menos assim:

    Dado 2 argumentos, um objeto qualquer (arg1) e um bloco, o método repassa o objeto arg1 como parâmetro do bloco e ao final da execução do bloco, retorna o arg1 que pode ter sofrido alteração ou não.

    Por exemplo, o seguinte método:

    def published_titles(posts)
      titles = {}
    
      posts.each do |p|
        titles.merge!(p.id => p.title) if p.published?
      end
    
      titles
    end
    

    Poderia ser reescrito assim:

    def published_titles(posts)
      returning(Hash.new) do |titles|
        posts.each { |p| titles.merge!(p.id => p.title) if p.published? }
      end
    end
    

    É isso. ;)


    UPDATE
    O Ceolin comentou comigo hoje que o returning seria “deprecated” no Rails 3. Isso é porque a partir do Ruby 1.9, a classe Object ganha um novo método (tap) que permite o desenvolvedor interagir em uma chamada de métodos em cadeia, por exemplo:

    Users
      .all .tap {|users| puts "Usuários: #{users.map(&id)}"}
      .last.tap {|user| puts "Último usuário: #{user.name}"}
      .posts
    

    Então, o nosso primeiro método poderia ser escrito, no Ruby 1.9, assim:

    def published_titles(posts)
      Hash.new.tap do |titles|
        posts.each { |p| titles.merge!(p.id => p.title) if p.published? }
      end
    end