Carlos Brando

Nome do Jogo

Edge Rails - Ruby 1.9, segurança e muito zelo

O core team do Rails tem trabalhando bastante ultimamente, está ficando até meio difícil de acompanhar o que está sendo feito. Desta vez vou fazer um resumão das principais alterações no código até agora, lembrando que tudo que isto ainda não está disponível para o público em geral. Mas quem quiser testar basta baixar a versão edge do Rails com o seguinte comando de dentro da sua aplicação:

rake rails:freeze:edge

Agora vamos ao que interessa.

Testes funcionais

Foram feitos ajustes nos testes funcionais gerados pelo scaffold para usar dados criados pelas fixtures e não usar nada hard-coded.

O que antes era assim:

def test_should_show_<%= file_name %>
  get :show, :id => 1
  assert_response :success
end

def test_should_get_edit
  get :edit, :id => 1
  assert_response :success
end

def test_should_update_<%= file_name %>
  put :update, :id => 1, :<%= file_name %> => { }
  assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
end

def test_should_destroy_<%= file_name %>
  assert_difference('<%= class_name %>.count', -1) do
  delete :destroy, :id => 1
end

Ficou assim:

def test_should_show_<%= file_name %>
  get :show, :id => <%= table_name %>(:one).id
  assert_response :success
end

def test_should_get_edit
  get :edit, :id => <%= table_name %>(:one).id
  assert_response :success
end

def test_should_update_<%= file_name %>
  put :update, :id => <%= table_name %>(:one).id, :<%= file_name %> => { }
  assert_redirected_to <%= file_name %>_path(assigns(:<%= file_name %>))
end

def test_should_destroy_<%= file_name %>
  assert_difference('<%= class_name %>.count', -1) do
  delete :destroy, :id => <%= table_name %>(:one).id
end

Databases.rake

Foi feita uma alteração no arquivo databases.rake que antes só considerava um banco de dados local como estando em localhost para considerar também o IP 127.0.0.1.

Novas exceções

Foram criadas exceções especificas para os erros 400, 401 e 403, como BadRequest, UnauthorizedAccess e ForbiddenAccess respectivamente. Onde o erro 400 (BadRequest) corresponde a uma url mal formatada ou algum parâmetro com formatação incorreta. Os outros dois erros são exatamente o que o nome já diz.

Excesso de zelo?

É interessante notar o excesso de zelo de David com o código, onde ele se preocupa até mesmo com uma linha em branco a mais ou a menos. Ele também criou um novo branch chamado 2-1 caching. David trabalhou bastante realizando merge para este novo branch e também se dedicou em corrigir problemas e realizar melhorias em tudo que diz respeito a cache.

Ruby 1.9

As melhorias no código prevendo o Ruby 1.9 também continuam. Algo interessante aqui foi esta simples alteração nestes dois métodos do arquivo even_odd.rb que ficaram assim:

def even?
  multiple_of? 2
end if RUBY_VERSION < '1.9'

def odd?
  !even?
end if RUBY_VERSION < '1.9'

Note que os métodos só serão definidos se a versão do ruby utilizada for anterior à 1.9, porque no Ruby 1.9 os métodos even? e odd? estão incorporados diretamente na classe Integer, tornando-os desnecessários no Rails. O mesmo ocorre no arquivo string.rb e starts_ends_with.rb onde o seguinte código foi acrescentado, já que os métodos start_with? e end_with? também foram implementados diretamente na classe String para a nova versão:

# arquivo string.rb
if RUBY_VERSION < '1.9'
  include ActiveSupport::CoreExtensions::String::StartsEndsWith
else
  alias starts_with? start_with?
  alias ends_with? end_with?
end

# arquivo starts_ends_with.rb
def self.included(base)
  base.class_eval do
    alias_method :start_with?, :starts_with?
    alias_method :end_with?, :ends_with?
  end
end

Também foram feitos outros ajuste concernente as mudanças nas classe DateTime e ao suporte do UTF8.

Segurança

Uma outro novidade interessante foi a criação de uma chave secreta (criptografada) para usar com cookies de sessão. Isto basicamente aumenta a segurança. Para usar basta executar:

rake generate:secret

E incluir a chave no arquivo config/environment.rb.

Muitas outras alterações foram realizadas, na grande maioria para melhorar a compatibilidade do Rails com o Ruby 1.9. O foco agora é este.

Comments