Arquivo

Arquivo da Categoria ‘Rails’

OmniAuth strategy for authenticating to Podio

22, dezembro, 2011 Sem comentários

Hello fellows,

Now that I finished my bachelor’s degree, I have free time to devote to open source projects that I like and a project that I really like is OmniAuth.

OmniAuth is a libary that standardizes multi-provider authentication for web applications. It’s very flexible and nice!

In my current job, we are using a lot a web application called Podio. It’s a very cool app.
So yesterday I started to develop a OmniAuth strategy for authenticating to Podio and today I finished it.

You can see the code here

Fell free to contribute and use it.

Thanks,

Categories: API, Gems, Rails, Ruby Tags:

Validates password strength in Rails app

13, dezembro, 2011 Sem comentários

Hello guys,

In the last weekend I finished a rubygem to validate the password strength. It’s a very simple gem, the code are available at github

To install:

gem install password_strong

It’s very simple to use, just add verify_strong in the attribute.

Example:

class User < ActiveRecord::Base

  verify_strong :password

end

In the future I gonna work in client side validation. Feel free to contribute.

Categories: Rails, Ruby Tags: , , ,

Integrations tests and Devise Login

27, outubro, 2011 Sem comentários

Yesterday I started doing a new project using devise gem to manage login features. When I started to do integration tests using rspec, I found a problem: devise test helpers doesn’t work with rspec integration test.
So this is a quick solution to fix this.

require 'spec_helper'
include Warden::Test::Helpers

describe "UserDashboards" do

  before(:each) do
    @user = Factory.create(:user)
    login_as @user, :scope => :user
  end

  it "should access dashboard" do
    visit users_dashboard_path
    page.should have_content("dashboard")
  end
end

At top of spec file, after require ‘spec_helper’ include Warden::Test::Helpers. And in the before(:each) block I just used a warden helper to do login.

will_paginate with Rails3 and Caching

26, janeiro, 2011 2 comentários

This is a quick solution to use will_paginate gem with Rails3 and Caching.
If you have a Rails application with cache and you are using will_paginate gem, maybe you have a problem with your routes.
A simple solution for this, is add a route in your routes.rb file.

For example, if you have a model named ‘post’ and you need add paginate in your index page. You have a problem, because for default your url with paginate is ‘/posts?page=number’ and this doesn’t work because your cache ignore the page parameter when it saves.
So the solution is change the routes for use some like this ‘/posts/page/number’.

In your routes.rb add:

  resources :posts, :except => :index
  get "posts(/pages/:page)" => "posts#index", :as => :posts

Just it! Now your application will work with page caching and paginate.

Categories: Rails, Ruby Tags:

Rails 2.3.10 on App Engine

26, dezembro, 2010 Sem comentários

Durante esse feriado de natal, estive testando o suporte a JRuby no Google App Engine. Conseguir rodar tanto uma aplicação feita com Sinatra quanto uma feita em Rails 2.3.10. Infelizmente a gem google-appengine ainda não suporta o Rails 3, mas esse suporte já está sendo desenvolvido.

Então pesquisando no Github achei um gist mostrando como gerar uma aplicação com Rails 2.3.10 e DataMapper, infelizmente não funcionou como deveria. Mas ao analisar percebi que o problema era não está incluindo o DataMapper::Resource no model, então fiz um fork do gist e modifiquei, testei e agora tudo está funcionando. Para acessar o gist clique aqui e divirta-se.

Categories: Gae, Java, JRuby, Rails, Ruby Tags: , , , , ,

De volta ao blog

6, novembro, 2010 Sem comentários

Olá pessoa, sei que o blog anda meio parado. Os últimos 3 meses foram de muita correria, fui promovido no trabalho, assumindo o cargo de gerente do setor de desenvolvimento, o que tomou grande parte do meu tempo.

Oxente Rails

Fazendo um resumo dos últimos meses, em agosto estive em natal, no OxenteRails. Um evento de muita qualidade, recomendo a todos, em 2011 estarei lá novamente. Agradecimento ao meu grande amigo Karlisson que ofereceu hospedagem.

Software Freedom Day 2010

Em Setembro, estive em Campina Grande (cidade maravilhosa que espero ter o prazer de conhecer melhor) para palestrar no Software Freedom Day 2010 sobre Ruby On Rails e Desenvolvimento Ágil. Em breve estarei postando os slides da palestra aqui. Infelizmente estava um pouco doente e não conseguir ficar até o final do evento (minha voz acabou no momento que terminei minha palestra). Espero está lá novamente em 2011.

Atualmente

Estou no momento mexendo um pouco com aplicativos de Web Mapping com Ruby On Rails, já havia mexido com Java e agora como tenho dedicado meu tempo somente a Rails, achei interessante começar a fuçar.

Para quem tem interesse, existe uma excelente Gem chamada Spatial_Adapter, que auxilia o ActiveRecord a tratar os dados geográficos. Atualmente os Bancos suportados são:
PostgreSQL (com sua extensão espacial Postgis)
e o MySQL.
E para quem quer utilizar o Google Maps para exibição dos mapas no seu aplicativo, também já existe uma Gem para isso, a google_maps.

Resumindo é isso, tentarei postar pelo menos mensalmente no blog.

Happy Hack ;-)

Desenvolvimento com Rails, mongoid, rspec e cucumber

12, agosto, 2010 1 comentário

Nesse rápido post irei demonstrar como iniciar o desenvolvimento de uma aplicação com o Rails 2.3.8, utilizando como banco de dados NoSql o Mongodb.
Para conexão com o banco, utilizaremos a gem Mongoid. Também iremos configurar para testes o Rspec e o Cucumber. Considerando a parti daqui que você tem todas as gems citadas anteriormente instaladas no seu ambiente.
Primeiro começaremos criando uma aplicação Rails, nada de novo aqui.

rails app_teste

Com isso iremos gerar toda a estrutura da aplicação. Agora vamos configurar as gems utilizadas, em ‘config/enviroment.rb’, adicionaremos dentro do bloco ‘Rails::Initializer.run’ a gem do mongoid:

Rails::Initializer.run do |config|
  config.gem 'mongoid'
  config.time_zone = 'UTC'
end

Com a gem do Mongoid, não precisaremos mais do ActiveRecord, para remover de sua aplicação basta adicionar dentro do mesmo bloco que você configurou o a gem, a seguinte linha ‘config.frameworks -= [:active_record]‘. Deixando meu enviroment.rb assim:

Rails::Initializer.run do |config|
  config.frameworks -= [:active_record]
  config.gem 'mongoid'
  config.time_zone = 'UTC'
end

Quando utilizavamos o ActiveRecord, por padrão ele procurava um arquivo YAML chamado database.yml no qual continha as informações sobre o meu banco. No caso do mongoid, podemos continuar com esse mesmo arquivo, ou criar outro (no meu caso eu prefiro criar um chamado mongoid.yml).
Abaixo segue o meu arquivo yml:

base: &base
  adapter: mongodb
  # em tempo de execucao vamos adicionar o "-#{Rails.env}" ao nomo do banco
  database: "feedse"
# Se estiver rodando o mongodb em outro host,
#vc deveria autenticar-se
  #host: host.mongodb.com
  #username: your-username
  #password: your-password

# use as proximas linhas para colocar algo especifico a cada ambiente
development:
  <<: *base

test:
  <<: *base

production:
  <<: *base

Feito isso, agora precisamos que nossa aplicação leia esse arquivo e configure nossa conexão com o banco. Para isso, criaremos um arquivo chamado ‘mongo.rb’ (ou qualquer outro nome que você queira) dentro do diretório config/initializers.
mongo.rb

require 'yaml'

mongo_config = YAML::load(File.read(File.join(Rails.root, 'config/mongoid.yml')))[Rails.env]

Mongoid.configure do |config|
  config.from_hash(mongo_config)
end

Com isso, já temos tudo pronto em relação ao nosso banco.

Criaremos então, um model chamado ‘Content’. Lembrando que como não utilizamos mais o ActiveRecord, nossa classe não deverá herdar ActiveRecord::Base.

Abaixo segue a implementação da nossa classe:

class Content
  include Mongoid::Document
  field :title, :type => String

  validates_presence_of :title
  validates_uniqueness_of :title
end

Para que nossa classe seja persistida em nossa banco, precisamos incluir o include Mongoid::Document. Precisamos também definir os campos que ele vai ter, no nosso caso somente o campo ‘title’. A definição básica dos campos segue a seguinte estrutura ‘field , :type => ‘. Para mais informações consulte a documentação do mongoid.

Utilizando o RSpec

Vamos gerar a estrutura do rspec, como faríamos em qualquer outro projeto Rails.

script/generate rspec

Logo após gerar a estrutura, abra o arquivo spec_helper.rb dentro do diretório spec recém gerado, e dentro do bloco Spec::Runner.configure comente as seguinte linhas:

  config.use_transactional_fixtures = true
  config.use_instantiated_fixtures  = false
  config.fixture_path = RAILS_ROOT + '/spec/fixtures/'

Um dos problemas que enfrentei logo quando comecei a mexer com Rspec junto com MongoDb, foi que o rpspec não limpa o banco de testes após executar os mesmos. Logo isso deverá ser feito na mão, para isso adicionaremos dentro do bloco Spec::Runner.configure em o seguinte código:

  config.after(:each) do
    Mongoid.database.collections.each do |collection|
      unless collection.name =~ /^system\./
        collection.remove
      end
    end
  end

Deixando o nosso spec_helper.rb assim:

ENV["RAILS_ENV"] ||= 'test'
require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment'))
require 'spec/autorun'
require 'spec/rails'

# in ./support/ and its subdirectories.
Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}

Spec::Runner.configure do |config|

  #config.use_transactional_fixtures = true
  #config.use_instantiated_fixtures  = false
  #config.fixture_path = RAILS_ROOT + '/spec/fixtures/'
  #clean database mongodb after tests
  config.after(:each) do
    Mongoid.database.collections.each do |collection|
      unless collection.name =~ /^system\./
        collection.remove
      end
    end
  end

end

Nesse caso o Rspec irá limpar o banco depois de cada teste ‘each’, mas você pode efetuar a limpeza somente depois de todos os testes terem rodado, nesse caso ao invés de ‘:each’ como parâmetro, utilizaremos ‘:suite’, e caso você queira executar alguma coisa antes dos testes, utilize o ‘config.before’, que funciona exatamente da mesma maneira do ‘config.after’, com a diferença de ser executado antes(before) dos testes.

Obs: Se você está utilizando também o cucumber e está com problemas em relação a limpeza do banco após os testes, a solução é simples.
Crie o arquivo ‘clean_mongo.rb’ (ou qualquer outro nome) dentro de features/support e adicione nele o código abaixo:

After do |scenario|
  Mongoid.database.collections.each do |collection|
    unless collection.name =~ /^system\./
      collection.remove
    end
  end
end

E com isso temos nossos testes funcionando com o mongodb.

Pesquisa avançada com MongoMapper, simulando um “like %”

3, agosto, 2010 Sem comentários

Esse post é uma “continuação” do anterior, estarei demonstrando como fazer uma query no “like %” no MongoDb, utilizando a gem MongoMapper

Como no post anterior, eu tenho o model “Person”:

class Person
  include MongoMapper::Document
  key :name, String
  key :middle_initial, String
end

E eu preciso encontrar todos os registros (no caso do Mongodb, documentos) que contenham o nome “Silva” em ‘name’, podendo ter vários Silva’s, como: “João da Silva”, “Maria Silva” e etc…

A solução, mais uma vez, é simples:

Person.all("$where" => "function() { return this.name.match(/"Silva"/i)"})

Pesquisa avançada com Mongoid, simulando um “like %”

1, agosto, 2010 Sem comentários

Comecei semana passada a utilizar o Mongodb (utilizando a biblioteca mongoid) em um novo projeto que estou desenvolvendo. Embora a documentação do Mongoid seja excelente, tive problemas para utilizar uma query com o ‘like %%’ de pesquisa como eu utilizava em bancos de dados relacionais.
A solução que eu encontrei foi utilizar uma Regex no parâmetro de busca.
Imagine que eu tenho um model chamado Person, como o abaixo:

class Person
  include Mongoid::Document
  field :name
  field :middle_initial
end

E eu preciso encontrar todos os registros (no caso do Mongodb, documentos) que contenham o nome “Silva” em ‘name’, podendo ter vários Silva’s, como: “João da Silva”, “Maria Silva” e etc…

A solução é simples:

Person.find(:all, :conditions => {:name => Regexp.new("Silva")}).entries

Então será retornado um array contendo todos os documentos com o termo “Silva” no nome.

Categories: Mongodb, NoSql, Rails, Ruby Tags: , , , ,

Utilizando o is_paranoid

13, junho, 2010 2 comentários

O is_paranoid é uma gem que faz com que os registros do banco não sejam apagados através do método destroy. Ao chamar o método destroy nosso objeto é apenas marcado como apagado e pode ser restaurado posteriormente, bem como listado através de método fornecidos pelo is_paranoid.
Sua utilização é bem simples, primeiro instale a gem:

gem install is_paranoid

Para que funcione em sua aplicação Rails, adicione no enviroment.rb , dentro do bloco de inicialização:

config.gem "is_paranoid"

Deixando mais ou menos assim:

Rails::Initializer.run do |config|
  # ...
  config.gem "is_paranoid"
end

Agora, nos models que vão utilizar dos recursos do is_paranoid, adicione logo após a declaração da classe ‘is_paranoid’

Exemplo:

class Student < ActiveRecord::Base
  is_paranoid
end

E para finalizar, crie uma migrate que adicione na tabela que vai utilizar o is_paranoid, o campo ‘deleted_at’, do tipo ‘timestamp’.

Exemplo:

class AddIsparanoidInStudent < ActiveRecord::Migration
  def self.up
    add_column :students, :deleted_at, :timestamp
  end

  def self.down
    remove_column :students, :deleted_at
  end
end

Pronto! Se quiser saber mais sobre o is_paranoid, consulte a documentação oficial no site do projeto.

Categories: Dicas, Rails, Ruby Tags: , ,