h1

XML no ActiveRecord

Junho 8, 2008

Bem Pessoal , hoje vamos falar um pouco de XML com Ruby on Rails, mais precisamente nos ActiveRecord.

Existe um método no ActiveRecord que é o to_xml, ele retorna os dados de um Model, ou os dados de uma coleção no formato XML. Vamos a alguns Exemplos:

Temos a tabela Produtos com os seguinte atributos:

* id
* nome
* descricao
* preco

Em nossa aplicação temos o Model Produto, referente a tabela Produtos.

Vamos criar um controller para que possamos testar o metodo de conversão pra XML.

ruby script/generate controller produtos

então vamos editar o arquivo criado em app/controller/produtos_controller.rb

class ProdutosController Produto.find(params[:id]).to_xml
end
end

Então acessando o endereço http://localhost:3000/aplicacao/produtos/produtoXml?id=1 aparecerá:

<xml version=”1.0″ encoding=”UTF-8″ ?>
<produto>
<descricao>Monitor LCD 17′<<!–descricao>
<id type=”integer>1<!–>
<nome>moinitor<<!–nome>
<preco type=”integer>600<<!–preco>

</produto>

legal né ? bem pratico .

Certo, mas o método não é so isso. Por exemplo, vamos dizer que não tivéssemos a necessidade da descrição do produto no XML, então poderiamos fazer da seguinte forma:

<code>...
render :xml => Produto.find(params[:id]).to_xml(:except=>:descricao)

Tendo como resultado:

xml version=”1.0″ encoding=”UTF-8″ ?>

<produto>
<id type=”integer>1<<!–id>
<nome>moinitor<!–>
<preco type=”integer>600<<!–preco>

<<!–/produto>

Interessante hein ? Ou senão vamos dizer que precise somente do id e o nome do produto. Poderíamos usar o :only da seguinte forma:


render :xml => Produto.find(params[:id]).to_xml(:only=>[:id,:nome])

Certo. mas não paramos por ai, o to_xml funciona com Array tambem , como por exemplo:



render :xml => Produto.find(:all).to_xml(:only=>[:id,:nome])


Tendo como resultado:

<xml version=”1.0″ encoding=”UTF-8″ ?>
- <produtos>
<produto>
<id type=”integer>1<<!–id>
<nome>moinitor<!–>
>
<produto>
<id type=”integer>2<!–>
<nome>Gravadora de DVD<<!–nome>

<!– </produto >

<<!–/produtos>

Então pelo que viamos é bastante simples trabalhar com XML nos ActiveRecord. Até a próxima pessoal!

h1

Evitando Inject SQL Com Rails

Junho 8, 2008

Bem Pessoal,

Hoje iremos falar de como evitar injeções SQL com Rails.

Vamos dizer que temos uma tabela de usuario com os seguintes campos:

#Tabela Usuario

* id- Integer
* Nome - Varchar(255)
* Login - Varchar(255)
* Senha - Varchar(255)
* Admin - Boolean

E temos uma pagina do nosso site para buscar usuarios pelo o nome na nossa base de dados.

Nosso Modelo Usuario:

#model

class Usuario < ActiveRecord::Base
end

Então temos no nosso UsuarioController o seguinte:

#controller
class UsuarioController < ApplicationController
def buscaUsuario
if params[:nome]
@usuarios = Usuario.find(:all,:conditions=>”nome like ‘%#{params[:nome]}%’”)
else
@usuarios = Usuario.find(:all)
end
end
end

E na view referente ao action buscarUsuario:

#view
<%=form_tag %>
<%=text_field_tag “nome”,nil %>
<%=submit_tag “Buscar”%>
<% for usuario in @usuarios%>
<% end %>
<%=usuario.nome%>
<%=end_form_tag %>

Então, basicamente temos um input, onde é digitado o nome do usuario, e o sistema mostra uma lista de usuarios que possui o que foi digitado no nome do usuario.

Ex.: Matos

resultado:

* Italo Matos
* Ronaldo Matos
* Matos José

O resultado está Ok. Então o que está errado ? Não é que a implementação esteja errado, mas com essa implementação abrimos furos na aplicação, e se tivermos um usuario malicioso, pode se aproveitar desses furos.



@usuarios = Usuario.find(:all,:conditions=>”nome like ‘%#{params[:nome]}%’”)

Acima temos implementação feita no nosso controller. Vamos digitar no input a palavra Matos então será gerado a seguinte consulta SQL:

SELECT * FROM usuarios WHERE (nome like ‘%Matos%’ )

Certo , até ai tudo bem.

Agora vamos dizer que o usuário digitou no input %’ and admin = 1 and ‘%%’ = ‘% Então , qual a consulta será gerada? a resposta logo abaixo:

SELECT * FROM usuarios WHERE (nome like ‘%%’ and admin = 1 and ‘%%’ = ‘%%’)

Ai é onde mora o perigo, ele irá listar todos os administradores do sistema, independente do nome. Isso dai que é chamado de injeção SQL. Conseguiu injectar codigo SQL em uma consulta, onde na verdade a consulta seria somente para buscar um usuario com um determinado nome.

Para previnirmos desses ataques, trocaremos no nosso controller:

@usuarios = Usuario.find(:all,:conditions=>"nome like '%#{params[:nome]}%’”)

Por:

@usuarios = Usuario.find(:all,:conditions=>["nome like ?","%"+params[:nome]+”%”])

Agora vamos ver como ficou a consulta SQL:

SELECT * FROM usuarios WHERE (nome like ‘%%’ and admin = 1 and ‘%%’ = ‘%%’)

ele o rails colocou as antes das aspas simples em que digitamos no input, assim nos previnimos das injeções SQL.

em consulta a banco de dados, deixe o framework tratar essas injeções.

Até a próxima pessoal.

h1

Usando ActiveRecord com Ruby sem Rails

Junho 8, 2008

Bem Pessoal,

Hoje iremos abordar um assunto bem interessante que seria o uso do modulo ActiveRecord sem a presença do Rails.

O ActiveRecord tem como uma de suas principais funcionalidades abstrair o acesso ao banco de dados para o desenvolvedor. Através dele é possivel fazer todo o CRUD ( Create, Read, Update, Delete ) sem usar a linguagem SQL, entre outras consultas inteligentes. Vamos a um exemplo:

Tenho minha tabela Contato, com os campos id, nome, telefone.

Então , teria uma classe Contato que herda da ActiveRecord::Base, onde no rails seria chamado de modelo.
class Contato < ActiveRecord::Base
end

Somente por herdar da ActiveRecord::Base, essa clas já possui todos métodos de acesso a base de dados.

#Criar um registro na base de dados
Contato.create(:nome=>”Italo Matos”, :telefone=>”29131829″)
#Consultar um registro por nome e imprimir na tela o id do mesmo.
puts Contato.find_by_nome(”Italo Matos”) .id
#Buscar o registro com o id igual a 1 e imprimir o nome na tela.
puts Contato.find(1) .nome

Então agora vamos saber como usar o ActiveRecord sem uso do rails. Vamos criar uma mini aplicação em Ruby que leia um arquivo texto com uma lista de contatos, e adicione na minha base de dados. O layout do arquivo segue o seguinte formato:

#nome Telefone

exemplo:

#agenda.txt

Italo 3984298

Carlos 9349238

Andre 3984298

Ronaldo 9328439

1o - Precisamos um arquivo com a configuração do nosso banco de dados, onde chamei de database.yml, onde tem o adapter , o nome da base de dados, login, senha e o host.

#database.yml

adapter: mysql
database: Agenda
username: root
password: 123456
host: localhost

2o - Vamos criar um arquivo chamado Processar.rb, onde o mesmo vai ler o agenda.txt, e cadastrar na base de dados Agenda, na tabela Contato.

#Processar.rb
require ‘rubygems’
require ‘active_record’
require ‘yaml’
dbconfig = YAML::load(File.open(’database.yml’))
ActiveRecord::Base.establish_connection(dbconfig)
class Contato valores[0],:telefone=>valores[1])
end

Executando o codigo: Ruby Processar.rb estaremos fazendo a migração dos dados em Agenda.txt para nossa base de dados. Então é isso ai pessoal, e até a próxima!

h1

Chamando Javascript apartir do Flex

Junho 8, 2008

Bem pessoal,

Continuando a série de Flex, hoje iremos falar um pouco sobre como chamar funções javascript, apartir de uma aplicação em Flex.

Então no meu HTML temos o seguinte java script:
...
function alertar() {
alert(”Olá pessoal!”);
}
function soma(a,b) {
return a+b;
}

Para chamar essa função apartir do flex basta no meu Action Script usar o metodo call, da classe ExternalInterface, como mostrarei abaixo.
...
public function testando() : void {
if (ExternalInterface.available) {
/*1o parametro é o nome da função javascript, e o segundo são os argumentos, no caso se a função tiver algum parametro.*/
ExternalInterface.call(”alertar”,null);
}
}
public function testandoComParametros() {
if (ExternalInterface.available) {
/* Esse segundo exemplo mostra de como passar os parametros e capturar o resultado.*/
ExternalInterface.call(”soma”,1,2);
}
}

Bem pessoal, com isso você pode chamar os javascript apartir do flex, um exemplo prático seria interagir com o mapa do google maps API, apartir do Action Script, que era o que estava precisando no momento que pensei em postar.

Até mais.

h1

Impressão no Flex - FlexPrintJob

Abril 24, 2008

Bem Pessoal,

Hoje o assunto é muito importante para que deseja fazer impressões de relatórios.
Existe uma class chamada FlexPrintJob que resolve isso para você. Vamos mostrar como deve ser feito.


import mx.printing.FlexPrintJob;
var p:FlexPrintJob = new FlexPrintJob();
public function imprimirGrafico() : void {
if (p.start()) {
p.addObject(areachart1);
p.send();
}
}
….

Vamos agora explicar:
você instanciou um objeto p do tipo FlexPrintJob.
no momento em que você chama o p.start() aparece a caixa de impressão, caso você cancele o p.start() retornará false. Se você clica em “Imprimir” o p.start() irá retornar true, continuando assim a execução do código.

p.addObject(areachart1) , você está adicionando somente o gráfico para impressão. Nesse caso, eu tenho na minha aplicação um objeto areachart1 do tipo AreaChart. Mas você pode colocar qualquer objeto que implemente a interface IUIComponent .
Então no momento que o usuário clicar no botão imprimir, a função imprimirGrafico() será chamada, e fazendo assim a impressão do gráfico que está na tela.

Até a próxima!

h1

IDE Flex com Rails

Abril 15, 2008

Bem Pessoal,

como alguns já sabem, mudei o endereço do meu blog para esse do wordpress. Onde tenho várias vantagens em reação ao anterior, como layout, melhor controle, estaticas etc. Mas vamos lá, inaugurar o blog com um post bem interessante que testei no fim de semana.

Ultimamente estou usando bastante o NetBeans 6.0 para desenvolver com Rails, até porque tinha muitas vantagens em relação ao redRails, e também devido a um projeto em java, que tem uma camada em rails, e outra em java, para não ficar usando 2 IDE`s optei em usar o NetBeans 6.0, onde me agradou bastante. Porém no fim de semana fiz uns testei com o Flex Builder 3.0, e juntamente com plugin do aptana e do Rad Rails, e gostei bastante do que vi. Então esse post vai ser mostrando como configurar o Flex Builder 3.0.

Vamos lá..

Para que não tem o Flex Builder Instalado, baixe no site ( http://www.adobe.com/products/flex/) e instale.

Abrindo o Flex Builder 3.0, vá em

Help->Software Updates->Find and Install

Clique em Search for new features to install [Next]

New Remote Site e adicione em name: Aptana e URL: http://update.aptana.com/update/studio/3.2/

Clique novamente em New Remote Site e coloque em name: RadRails e URL: http://update.aptana.com/install/rails/3.2/

Depois de ter adicionado os 2 plugins necessários, clique em [finish]

E espere baixar e instalar. Depois disso reinicie o Flex Builder 3.0, e pronto. Já vai ter uma ferramenta robusta para desenvolver aplicações que envolve Flex + Rails. Produtividade ao extremo.

até a próxima pessoal.