nelson corrêa viana júnior

setembro 11, 2007

Ruby com MySQL (Básico)

Filed under: mysql, programação, ruby on rails, software livre — nelson @ 22:33:24

Primeiramente tenha o módulo do mysql instalado. Caso não tenha:
gem install mysql

Agora algo bem simples.
Nada mais simples de início como uma conexão com o banco. 🙂
require “mysql”

#Como de custume vamos instanciar algumas variáveis com os valores ‘usuário’, ‘senha’ e ‘host’.
user_mysql = “root”
pass_mysql = “pass”
host_mysql = “localhost”

database_mysql = “nome-da-database”

#Criando uma variável chamando a classe do MySQL.
mydb = Mysql.new(user_mysql, pass_mysql, host_mysql)

#Se você já tem uma database criada, para seleciona-la use:
selecionar = mydb.select_db(database_mysql)
#Caso contrário pode cria-la:
novadb = mydb.query(“CREATE DATABASE #{database_mysql}”)

#Agora o essencial do banco de dados: a listagem.
#Vou colocar com todos os passos já citados.

mydb = Mysql.new(user_mysql, pass_mysql, host_mysql)
selecionar = mydb.select_db(database_mysql)
sqllistar = mydb.query(“SELECT * FROM tabela“)
listar = sqllistar.fetch_fields
listar.each do |lista|
puts lista.name
end

mydb.close

De início, simples e fácil.
🙂

(Essa merda de editor do wordpress acaba com toda minha identação)

setembro 6, 2007

RoR: Sistema simples de autenticação

Filed under: programação, ruby on rails, software livre — nelson @ 16:45:02

Model

1) script/generate model user
1.1) edite o arquivo db/migrate/XXX_create_users.rb

class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.column :firstname, :string
t.column :lastname, :string
t.column :username, :string, :null => false
t.column :password, :string, :null => false
t.column :hashed_password, :string, :limit => 40, :null => false
t.column :admin, :boolean, :default => 0
end
end

def self.down
drop_table :users
end
end

1.2) edite o app/models/user.rb

require ‘sha1’

class User < ActiveRecord::Base

attr_accessor :password
attr_protected :hashed_password

validates_presence_of :password, :password_confirmation

validates_uniqueness_of :username
validates_confirmation_of :password, :on => :create,
:if => lambda { |user| user.new_record? or not user.password.blank? }
validates_length_of :password, :within => 5..40,
:if => lambda { |user| user.new_record? or not user.password.blank? }

def self.hashed(str)
SHA1.new(str).to_s
end

def self.authenticate(user_info)
user = find_by_username(user_info[:username])
if user && user.hashed_password == hashed(user_info[:password])
return user
end
end

before_save :hashed_password
before_update :hashed_password

def hashed_password
if not password.blank?
self.hashed_password = self.class.hashed(password)
end
end
end

Controller

2) script/generate controller user index login process_login logout update_password
2.1) edite o arquivo app/controllers/user_controller.rb

class UserController < ApplicationController

before_filter :login_required, :only => :my_account

def index
render :action => “login”
end

def login
@user = User.new
@user.username = params[:username]
end

def process_login
if user = User.authenticate(params[:user])
session[:user] = user.id
redirect_to session[:return_to] || “/”
else
flash[:error] = “Invalid login.”
redirect_to :action => “login”, :username => params[:user][:username]
end
end

def logout
session[:user] = nil
flash[:message] = “Logout successfully.”
redirect_to :action => “login”
end

def update_password

if request.post?
#Store password fields
password = params[:user][:password]
password_confirmation = params[:user][:password_confirmation]

@user = User.find(session_user.id)
if @user
if password == password_confirmation
if password.blank? or password_confirmation.blank?
flash[“error”] = “Password and/or Password Confirm is blank.”
else
@user.password_confirmation = password_confirmation
@user.update_attribute(“password”, password)
if @user.save
flash[“message”] = “Password was successfully changed.”
end
end
else
flash[“error”] = “Password and/or Password Confirm invalid.”
end
end
redirect_to :action => “my_account”
end
end

def my_account
end
end

3) agora edite o app/controllers/application.rb

class ApplicationController < ActionController::Base
before_filter :set_user
helper_method :session_user

User.content_columns.each do |column|
in_place_edit_for :user, column.name
end

def set_user
@user = User.find(session[:user]) if @user.nil? && session[:user]
end

def session_user
@session_user ||= User.find(:first, :conditions => [“id = ?”, session[:user]])
end

def login_required
return true if @user
access_denied
return false
end

def access_denied
session[:return_to] = request.request_uri
flash[:error] = “Oops. You need to login before you can view that page.”
redirect_to :controller => “user”, :action => “login”
end
end

Views

<!– app/views/user/login.rhtml –>
<% if @flash[:message] %><div><%= @flash[:message] %></div><% end %>
<% if @flash[:error] %><div><%= @flash[:error] %></div><% end %>
<%= form_tag :action => ‘process_login’ %>
Username: <%= text_field “user”, “username” %>
Password: <%= password_field “user”, “password” %>
<%= submit_tag %>
<%= end_form_tag %>

<!– app/views/user/my_account.rhtml –>
<h2>Account Info</h2>

<%= error_messages_for “user” %>
<% if flash[“error”] %><p><%= flash[“error”] %></p><% end %>
<% if flash[“message”] %><p><%= flash[“message”] %></p><% end %>

<h3>Hello! <%= session_user.lastname %>, <%= session_user.firstname %></h3>

<cite>P.S: If you want edit some field, click on value.</cite>
<p><strong>Firstname:</strong> <%= in_place_editor_field :user, :firstname %></p>
<p><strong>Lastname:</strong> <%= in_place_editor_field :user, :lastname %></p>
<p><strong>Username:</strong> <%= in_place_editor_field :user, :username %></p>
<p>
<%= form_tag :action => “update_password” %>
<strong>New password:</strong>
<br />
<%= password_field “user”, “password” %>
<br />
<strong>Confirm:</strong>
<br />
<%= password_field “user”, “password_confirmation” %>
<br /><br />
<%= submit_tag “Change my password” %>
<%= end_form_tag %>
</p>

Layouts

4) crie ou edite o app/views/layouts/application.rhtml

<html>
<head>
<title>título</title>
<%= javascript_include_tag :defaults %>
</head>
<body>
<div id=”all”>
<div id=”header”>
<h1>header</h1>
</div>
<div id=”contents”>
<%= yield %>
</div>
</div>
</body>
</html>

setembro 4, 2007

RoR: in place editor

Filed under: javascript, programação, ruby on rails, software livre — nelson @ 0:07:25

Hoje quando estava criando a parte de ‘Account Info’ resolvi colocar um ‘ajax in place editor’ para facilitar a edição dos campos. Pra falar a verdade eu nunca havia usado essa propriedade do ajax, apesar de achar muito bacana.

Eu não costumo – apesar que a partir de agora eu posso dizer: não costumava – usar javascript pelo motivo da acessibilidade do usuário final.

Mais em vista que sites de grande porte não se preocupa tanto com essa parte de javascript não-obstrutivo, porquê eu preocupar? Partindo disso eu fui atrás de algum código que facilitasse a inserção do ‘in place editor’ no Ruby On Rails.

E não é que eu achei algo?! 🙂

O código é o seguinte:

Primeiramente você adiciona a linha abaixo no app/views/layouts/application.rhtml (caso não exista o arquivo, pode criar, sem problemas).

<%= javascript_include_tag :defaults %>

Obs: Insira essa linha entre a tag <head></head>.

Agora, vá em app/views/user/arquivo.rhtml e insira este código:

<% for column in User.content_columns %>

 <p>

 	<b><%= column.human_name %>:</b>

 	<%= in_place_editor_field :user, column.name %>

 </p>

<% end %>

Caso você queira usar:

<%= in_place_editor_field :user, :username

Pode usar, não há problema.

E no arquivo app/controllers/application.rhtml insira:

User.content_columns.each do |column|

 in_place_edit_for :user, column.name

end

Obs: Aonde está negrito quer dizer que você terá que adaptar.

agosto 24, 2007

Instalando Ruby on Rails (Ubuntu 7.04 Feisty Fawm)

Filed under: apache, mysql, programação, ruby on rails, software livre — nelson @ 14:16:36

A instalação é muito mais simples do que tenho olhado em vários links por ai. 🙂

1° Passo

Instalando o Ruby

sudo apt-get install ruby rdoc ri irb libyaml-ruby libzlib-ruby ri ruby1.8-dev

2° Passo

Instalando RubyGems

2.1) Download rubygems
wget http://rubyforge.org/frs/download.php/11289/rubygems-0.9.0.tgz

2.2) Descompactando
tar zxvf rubygems-0.9.0.tgz

2.3) Entrando no dir
cd rubygems-0.9.0

2.4) Instalando
sudo ruby setup.rb

2.5) Atualizando gem
gem update –system

3° Passo

Instalando Rails

sudo gem install rails –include-dependencies

4° Passo

Instalando a lib de ligação com o MySQL

sudo apt-get install libmysql-ruby

5° Passo

Instalando mongrel

sudo gem install mongrel –include-dependencies

agosto 4, 2007

Atualizando dados instantâneamente

Filed under: javascript, programação — nelson @ 21:32:38

No nosso caso iremos precisar do prototype.

Uma observação:
– Caso o javascript do browser estiver desabilitado esta função não funcionara. (meio difícil isso hoje em dia)

new PeriodicalExecuter(function(fr) {
	var ajax = ajaxRequest();

	/*
	no arquivo.ext você usa a linguagem que preferir (php, cgi, asp, coldfusion..)
	porém dentro do arquivo você tera que imprimir na tela (echo, response.write, print...)
	*/

	ajax.open('GET' , 'arquivo.ext', true);
	ajax.onreadystatechange = function() {
		if(ajax.readyState == 1) {
			response("Atualizando...");
		}
		if(ajax.readyState == 4) {
			if (ajax.status == 200) {

				//no 'id' abaixo você colocara o id aonde receberá o resultado
				$('id').innerHTML = ajax.responseText;

			}
		}
	}
	ajax.send(null);
}, 1);

//este 1 é o tempo de atualização (em segundos)

Links usando javascript não-obstrutivo

Filed under: javascript, programação — nelson @ 17:08:18

Antes de tudo você precisará fazer download do prototype.js. Este arquivo é quem vai nos ajudar.
Ele é um framework desenvolvido em javascript e tem funções que simplificam a nossa vida.

Site Oficial do prototype

Event.observe(window, 'load', loopLinks);
function loopLinks() {

	var body = document.getElementsByTagName('body').item(0);
	var links = body.getElementsByTagName('a');

	//loop em todos os links (<a>)
	for(var i=0; i < links.length; i++)
	{
		//coloca cada link numa variavel
		linkBtn = links[i];
		//captura o atributo rel de cada link
		var rel = new String(linkBtn.getAttribute('rel'));

		//verifica se a palavra delete esta no rel
		if(rel.substring(0, 6) == 'delete')
		{
			//caso esteja ele continua na função click
			linkBtn.onclick = function()
			{
				//chama o ajax
				var ajax = ajaxRequest();

				/*
				agora queremos capturar o id.
				lembrando que no atributo rel do link esta da seguinte forma: acao:id

				ex: <a rel="delete:2" href="arquivo.php?acao=delete&id=2">link</a>
				*/
				var id = this.getAttribute('rel').split(":")[1];

				/*
				setamos os parâmetros.
				estes parâmetros serão enviados para um arquivo.php no método GET
				*/
				var params = '&postAct=delete&postId=' + id;

				/*
				colocaremos em uma variavel qual é o id do link
				neste momento o link se encontra da seguinte forma:

				<a id="noticia" rel="delete:2" href="arquivo.php?acao=delete&id=2">link</a>
				*/
				var divID = this.getAttribute('id');

				/*
				aqui fica a função do ajax de enviar ao arquivo.php os parâmetros e retornar algo
				estas linhas de função do ajax estão melhor explicadas pela w3schools.
				*/
				ajax.open('GET' , 'arquivo.php?ajax=1' + params, true);
				ajax.onreadystatechange = function() {
					if(ajax.readyState == 1) {
						response("Carregando...");
					}
					if(ajax.readyState == 4) {
						if (ajax.status == 200) {
							response(ajax.responseText);
						}
					}
				}
				ajax.send(null);
				//este return false faz com que o link pare.
				return false;
			}

		}
	}
}
function ajaxRequest() {
	var ajax;
	try {
		ajax = new XMLHttpRequest();
	} catch(ee) {
		try {
			ajax = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
			try {
				ajax = new ActiveXObject("Microsoft.XMLHTTP");
			} catch(E) {
				ajax = false;
			}
		}
	}
	return ajax;
}

Blog no WordPress.com.