XML no ActiveRecord

Posted junho 8, 2008 by italomatos
Categories: rails, ruby

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 :x ml => 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 :o nly da seguinte forma:

...
render :x ml => 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 :x ml => 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!

Evitando Inject SQL Com Rails

Posted junho 8, 2008 by italomatos
Categories: Uncategorized

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.

Usando ActiveRecord com Ruby sem Rails

Posted junho 8, 2008 by italomatos
Categories: ruby

Tags:

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!

Chamando Javascript apartir do Flex

Posted junho 8, 2008 by italomatos
Categories: flex

Tags:

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.

Impressão no Flex – FlexPrintJob

Posted abril 24, 2008 by italomatos
Categories: flex

Tags:

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!

IDE Flex com Rails

Posted abril 15, 2008 by italomatos
Categories: flex

Tags: ,

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.