#desenvolvimento

Como adicionar botões de compartilhamento de redes sociais – Linkedin


Olá leitores.
Neste post iremos implementar o compartilhamento pelo Linkedin utilizando um projeto RoR com HAML e Javascript. Com projeto criado iremos adicionar o código abaixo no arquivo index.html.haml:

/ Botão de compartilhamento pelo Linkedin.
.span
  %script{:src => "//platform.linkedin.com/in.js", :type => "text/javascript"}
  %script{"data-url" => "http://#{request.host}:#{request.port}#{request.fullpath}", :type => "IN/Share"}

Este botão do Linkedin irá compartilhar o link da sua página que será formado por este código:

http://#request.host:#request.port#request.fullpath

Onde:
#{request.host} – Retorna o host da aplicação.
#{request.port} – Retorna a porta.
#{request.fullpath} – Retorna o caminho da página composto também pelas pastas.

Assim como o Twitter, o compartilhamento pelo Linkedin é super tranquilo. Para saber um pouco mais sobre o compartilhamento pelo Linkedin acesse a documentação disponível aqui.

Até breve 😉

Anúncios
Padrão
#desenvolvimento

Como adicionar botões de compartilhamento das redes sociais


Olá pessoal.

Geralmente a primeira coisa que se pensa quando é preciso fazer algum compartilhamento através das redes sociais é: Vamos olhar a API! Entretanto nem sempre é necessário implementar uma integração para simplesmente poder compartilhar uma informação simples.

Por isto, procurei algumas maneiras para fazer isto de forma sucinta e irei partilhar com vocês a solução dividida em uma série com mais quatro posts para cada uma das redes sociais listadas:

Twitter
Linkedin
Facebook
Google Plus

Os botões serão adicionados em um projeto Ruby on Rails com a utilização de HAML e Javascript. Então para adiantar crie um projeto RoR:

rails new app_share

Apesar de utilizar HAML para os próximos post você pode utilizar o mesmo código para páginas HTML, sendo necessário algumas adaptações.

Até breve 😉

Padrão
#configuração

Instalando o Project Fedena no Ubuntu Server


Olá pessoas.

Há algum tempo descobrir o Fedena, um projeto desenvolvido com Ruby on Rails, que apresenta uma proposta muito interessante para gerência de escolas. Descobrir também que eles possuem uma versão Free & Opensource mais conhecido como Project Fedena.

Por curiosidade quis instalar a versão opensource no Ubuntu Server 11.10. Ao tentar instalar de acordo com as instruções do site obtive muitos erros, então resolvi compartilhar um passo-a-passo da instalação aqui no blog. Mãos a obra:

Instale o Ruby e suas dependências:

apt-get install ruby irb libopenssl-ruby libreadline-ruby rdoc ri ruby ruby-dev rubygems

Instale o MySQL:

apt-get install libmysqlclient-dev mysql-server

Instale o unzip:

apt-get install unzip

Instale a gem do Rails:

gem install Rails

Instale a gem do MySQL:

gem install mysql

Baixe o projeto do Fedena:

wget http://www.projectfedena.org/download/fedena-bundle-linux

Extraia o projeto:

unzip fedena-bundle-linux

Entre na pasta do projeto:

cd fedena2.2_bundle_pack/

Instale as dependências do projeto:

bundle install –local

Troque as senhas do banco de dados contidas no arquivo de configuração do banco de dados config/database.yml:

development:
host: localhost
adapter: mysql
database: fedena_ultimate
port: 3306
username: root
password: SUASENHA

Crie o banco de dados:

rake db:create

Então o primeiro erro acontece:

rake aborted!
You have already activated rake 0.9.2.2, but your Gemfile requires rake 0.8.7. Using bundle exec may solve this.

Uma forma de solucionar este erro é removendo todas as versões do rake:

gem uninstall rake

Se você possuir mais de uma versão será apresentada uma lista com todas as versões, escolha a opção que representar todas as versões.

Instale a versão do rake solicitada para o projeto Fedena:

gem install rake -v=’0.8.7′

Tente criar o banco de dados novamente:

rake db:create

E lá vem o segundo erro:

rake aborted!
uninitialized constant ActiveSupport::Dependencies::Mutex

Para solucionar este erro abra o arquivo Rakefile e acrescente a linha abaixo antes da linha que contém require ‘rake’:

require ‘thread’

Tente criar o banco de dados mais uma vez:

rake db:create

Então você deve receber esta mensagem de sucesso:

** Invoke db:create (first_time)
** Invoke db:load_config (first_time)
** Invoke rails_env (first_time)
** Execute rails_env
** Execute db:load_config
** Execute db:create

Povoe as tabelas executando o comando:

rake db:migrate

E mais um erro acontece:

rake aborted!
undefined local variable or method `version_requirements’ for #<Rails::GemDependency:0x7f595afa7e30>

Para resolver este erro desinstale todas as versões do rubygems-update:

gem uninstall rubygems-update

Instale a versão 1.4.2 do rubygems-update:

gem install rubygems-update -v=’1.4.2′

Tente atualizar suas gems:

update_rubygems

Verifique se suas gems continuam instaladas:

gem list

No meu caso todas as gems foram removidas, então tive que instalar o Rails novamente:

gem install rails

Tente novamente povoar as tabelas:

rake db:migrate

É provável que receba este erro:

rake aborted!
Bundler couldn’t find some gems.Did you run `bundle install`?

Se receber este erro execute o comando:

bundle install

Remova novamente a versão 0.9.2.2 do rake:

gem uninstall rake -v=’0.9.2.2′

Agora é possível povoar as tabelas:

rake db:migrate

Por fim inicie o servidor:

bundle exec script/server

Pelo browser acesse a página inicial do Fedena:

http://localhost:3000

Para logar utilize as credenciais:

Username: admin

Password: admin123

Enjoy 😉

Acredito que estes problemas possam ser evitados com a utilização do RVM, mas isto é assunto para outro post.

Até breve.

Padrão
#configuração, #desenvolvimento

Instalando Spree no Ubuntu Server


Olá pessoal.
Este post será uma breve ajuda para instalação do Spree que é uma loja virtual opensource desenvolvida em Ruby on Rails.
Os detalhes do projeto podem ser vistos aqui no GitHub. A instalação está bem detalhada mas há uma grande chance de não funcionar de primeira por causa da versão do Rails, como foi o meu caso.
Ao tentar instalar recebi esta mensagem de erro:

ERROR: While executing gem … (Gem::DependencyError)
Unable to resolve dependencies: activerecord requires activesupport (= 3.1.4), activemodel (= 3.1.4); actionmailer requires actionpack (= 3.1.4); activeresource requires activesupport (= 3.1.4), activemodel (= 3.1.4); railties requires activesupport (= 3.1.4), actionpack (= 3.1.4)

E para resolver removi a versão atual do Rails:

gem uninstall rails

Instalei a versão 3.1.4 do Rails:

gem install rails -v 3.1.4

Neste momento tentei instalar novamente o Spree, mas recebi um novo erro:

ERROR: Error installing spree:
ERROR: Failed to build gem native extension.
/usr/bin/ruby1.8 extconf.rb
checking for libxml/parser.h… no
libxml2 is missing. please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.

Para solucioná-lo instalei as libs:

apt-get install libxml2 libxml2-dev libxslt1-dev

Enfim instalei o Spree:

gem install spree

Criei o projeto rails:

rails new store

Associei o projeto Rails ao projeto Spree:

spree install store

Neste momento será necessário responder a algumas perguntas:

Would you like to install the default gateways? (yes/no) [yes] yes
Would you like to run the migrations? (yes/no) [yes] yes
Would you like to load the seed data? (yes/no) [yes] yes
Would you like to load the sample data? (yes/no) [yes] yes
Admin Email [spree@example.com] seu_email@email.com
Admin Password [spree123] sua_senha

Entrei na pasta do projeto:

cd store

Iniciei o servidor WEBrick:

rails s

E pronto!!! Agora é só acessar o endereço http://localhost:3000 no seu navegador e você já pode logar com o e-mail e senha cadastrados na hora da criação do projeto Spree.
Espero que seja útil.

Até breve 😉

Padrão
#desenvolvimento, #projetos

Criando testes unitários com Ruby on Rails


Olá pessoal.

Após ter criado os models precisamos criar testes de unidade para validar as operações que iremos realizar.

Para isso acesse a pasta do seu projeto:

cd projetorails

Execute o comando abaixo para criar todos os bancos incluindo o banco de teste:

rake db:create:all

A saída do comando deve ser algo igual à:

db/production.sqlite3 already exists
db/development.sqlite3 already exists
db/test.sqlite3 already exists

Altere o ambiente de desenvolvimento para ambiente de teste:

rake db:migrate RAILS_ENV=test

Remova todo o conteúdo do arquivo test/fixtures/contatos.yml e adicione o conteúdo que será utilizado para gerar os testes:

contato:
   telefone: 11 2222 3333
   celular:  11 9999 8888
   twitter:  monteirobrena
   facebook: monteirobrena
   msn:      brenamonteiro@hotmail.com

Observação: é necessário manter a identação neste arquivo para diferenciar as propriedades do Contato.

Crie o teste unitário que verificará  as operações que você pode fazer com o model Contato:

require 'test/test_helper'
   class ContatoTest < ActiveSupport::TestCase
      fixtures :contatos
      def test_create_contato
         # Cria o contato com o conteúdo especificado no arquivo test/fixtures/contatos.yml.
         contato_brena = Contato.new :telefone => contatos(:contato).telefone,
                                     :celular  => contatos(:contato).celular,
                                     :twitter  => contatos(:contato).twitter,
                                     :facebook => contatos(:contato).facebook,
                                     :msn      => contatos(:contato).msn
   end
   def test_save_contato contato_brena
      # Verifica se consegue salvar o contato.
      assert contato_brena.save
   end
   def test_copy_contato
      # Cria o contato.
      contato_brena = test_create_contato
     # Salva o contato.
      test_save_contato contato_brena
      # Copia o contato pelo ID.
      contato_brena_copia = Contato.find(contato_brena.id)
      # Verifica se os contatos são iguais.
      assert_equal contato_brena, contato_brena_copia
   end
   def test_update_contato
      # Cria o contato.
      contato_brena = test_create_contato
      # Modifica o facebook do contato.
      contato_brena.facebook = ""
      # Salva o contato.
      test_save_contato contato_brena
   end
   def test_destroy_contato
      # Cria o contato.
      contato_brena = test_create_contato
      # Salva o contato.
      test_save_contato contato_brena
      # Destrói o contato.
      contato_brena.destroy
   end
end

Para executar o teste rode o comando:

ruby test/unit/contato_test.rb

É importante lembrar que as alterações feitas nos testes não serão visualizadas no banco de dados. O arquivo YAML é utilizado apenas para popular o banco de teste, mas as operações de save e destroy não irão alterar as informações contidas no banco.

Saber isso é fundamental, perdi um tempo tentando entender porque as alterações não eram realizadas no banco e só após a ajuda do Rafael Ponte é que descobri o motivo pelo qual não via alterações no banco. Compartilho o link do gist que esclareceu minhas dúvidas sobre teste unitário.

Lembre-se que esta é apenas uma simples forma de começar a fazer testes nos projetos RoR.

Até breve 😉

Padrão
#desenvolvimento, #projetos

Criando models com Ruby on Rails


Voltando ao Rails gostaria de compartilhar a criação dos models do meu novo projeto pessoal.

O primeiro passo é criar um projeto Rails como o que foi criado aqui.

O contexto utilizado será referente a uma publicação de um anúncio bem simplificado. E para isso será necessária a criação de três models: Usuário, Contato e Anúncio com as associações apresentadas na figura abaixo.

Aluguel Particular - Diagrama de classe

Aluguel Particular – Diagrama de classe

Entre na pasta do seu projeto Rails:

cd projetorails

Crie o model do Usuário:

rails g model usuario

O Rails criou uma migração inicial para o nosso model. Esta migração encontra-se na pasta db/migrate/<horário_da_criação>_create_usuarios.rb. Abra a migração criada para o model e adicione as colunas:

class CreateUsuarios < ActiveRecord::Migration
   def self.up
      create_table :usuarios do |t|
         t.string  :email, :limit => 50
         t.string  :senha, :limit => 20
         t.string  :nome,  :limit => 50
         t.string  :CPF,   :limit => 14
         t.timestamps
      end
   end

   def self.down
      drop_table :usuarios
   end
end

No terminal execute o comando abaixo para rodar a migração que criará a tabela de usuários:

rake db:migrate

Crie o model de Contato:

rails g model contato

Altere a migração db/migrate<horário_da_criação>_create_contatos.rb:

class CreateContatos < ActiveRecord::Migration
   def self.up
      create_table :contatos do |t|
        t.string :telefone, :limit => 20
        t.string :celular,  :limit => 20
        t.string :twitter,  :limit => 50
        t.string :facebook, :limit => 50
        t.string :msn,      :limit => 50
        t.timestamps
      end
   end

   def self.down
      drop_table :contatos
   end
end

No terminal execute o comando abaixo para rodar a migração que criará a tabela de contatos:

rake db:migrate

Crie o model para Anúncio:

rails g model anuncio

Altere a migração db/migrate<horário_da_criação>_create_anuncios.rb:

class CreateAnuncios < ActiveRecord::Migration
   def self.up
      create_table :anuncios do |t|
         t.text :descricao, :limit => 2048
         t.timestamps
      end
   end

   def self.down
      drop_table :anuncios
   end
end

No terminal execute o comando abaixo para rodar a migração que criará a tabela de anúncios:

rake db:migrate

Quase pronto! Os models estão criados e você pode visualizar as tabelas através do plugin SQLite Manager para o Firefox. Mas ainda falta acrescentar as associações entre os models e entre as tabelas.

Vamos então associar o contato ao usuário. Edite o model Usuário que se encontra no diretório app/models/usuario.rb:

class Usuario < ActiveRecord::Base
   has_one :contato
end

Agora edite o model Contato (app/models/contato.rb):

class Contato < ActiveRecord::Base
   belongs_to :usuario
end

Esta associação nos diz que um usuário possui um contato. Sendo assim vamos criar uma migração para adicionar este relacionamento na tabela.

rails g migration add_column_contato_usuario

E edite a migração criada em db/migrate/<horário_da_criação>_add_column_contato_usuario.rb:

class AddColumnContatoUsuario < ActiveRecord::Migration
   def self.up
      add_column :usuarios, :contato_id, :integer
   end

   def self.down
      remove_column :usuarios, :contato_id
   end
end

No terminal execute o comando para gerar a migração de atualização da tabela de usuários:

rake db:migrate

E para finalizar vamos associar o anúncio ao usuário.
Edite o model Usuário(app/models/usuario.rb) para indicar que um usuário possui vários anúncios:

class Usuario < ActiveRecord::Base
   has_one  :contato
   has_many :anuncios
end

Edite também o model Anúncio(app/models/anuncio.rb) para afirmar que ele pertence a um usuário:

class Anuncio < ActiveRecord::Base
   belongs_to :usuario
end

Crie a migração que irá adicionar o id do usuário ao anúncio:

rails g migration add_column_usuario_anuncio

Edite a migração db/migrate/<horário_da_criação>_add_column_usuario_anuncio.rb:

class AddColumnUsuarioAnuncio < ActiveRecord::Migration
   def self.up
      add_column :anuncios, :usuario_id, :integer
   end

   def self.down
      remove_column :anuncios, :usuario_id
   end
end

No terminal execute o comando para gerar a migração de atualização da tabela de anúncios:

rake db:migrate

Agora sim os models estão prontos para criarmos os testes e as validações, mas isto será assunto para o próximo post.

Para entender melhor o funcionamento dos models e suas associações não deixe de ler a apostila RR-71 da Caelum e a documentação da API ActiveRecord.

Até breve 😉

Padrão
#prosa

DevDay 2011


Ei pessoal.

Este é mais um post de divulgação de evento que será realizado em BH.
O DevDay 2011 acontecerá no dia 27/08 na UNA Campus Aimorés e abordará assuntos como:

  • Planejamento e acompanhamento ágil com Team Foundation
  • Qualidade de codificação
  • Windows Azure
  • TDD
  • Novidades do Rails 3.1
  • Programação funcional com C#
  • Evolução do Javascript

A inscrição pode ser feita no site http://devday.devisland.com

Bom evento pra todos 😉

Padrão