Cositas sobre Ruby on Rails

martes, 29 de enero de 2008

Roo: Rails y hojas de cálculo

http://roo.rubyforge.org/

Gema que nos permite acceder al contenido de
  • Open-office spreadsheets (.ods)
  • Excel spreadsheets (.xls) and
  • Google (online) spreadsheets
La probaré.

Staticmatic: Websites estáticos "a la Ruby"

Staticmatic es un sistema con el que podemos diseñar sitios web estáticos `a la Ruby`. A veces, por los requerimientos de nuestros clientes no necesitamos que nada sea dinámico en la web que vamos a diseñar (algo raro hoy). Para eso vale Staticmatic. No necesitamos Rails para realizar un sitio totalmente estático.

Staticmatic se suministra como una gema, por lo que la instalación es simple:
gem install staticmatic
Ahora generaremos un proyecto:
staticmatic setup mi_proyecto
created mi_proyecto/site/
created mi_proyecto/site/stylesheets
created mi_proyecto/site/images
created mi_proyecto/site/javascripts
created mi_proyecto/src/
created mi_proyecto/src/pages/
created mi_proyecto/src/layouts
created mi_proyecto/src/stylesheets
created mi_proyecto/src/partials
created mi_proyecto/src/helpers
Done

Ya podemos ver nuestro proyecto funcionando:
cd mi_proyecto
staticmatic preview .
StaticMatic Preview Server Starting...
Running Preview of . on localhost:
Ahora, si vamos al navegador a http://localhost:3000 podemos ver nuestra página funcionando. De momento vemos, más bien, poco... hemos de ir poco a poco trabajando el diseño (HTML + CSS + JS)

Para diseñar con Staticmatic hemos de hacerlo con HAML y con SASS, cosa que es una ayuda a mi entender.

¿Cúal es la estructura con la que nos encontramos?

mi_proyecto/
|-- site
| |-- images
| |-- javascripts
| `-- stylesheets
`-- src
|-- helpers
|-- layouts
| `-- application.haml
|-- pages
| `-- index.haml
|-- partials
`-- stylesheets
`-- application.sass
Si nos fijamos, la estructura tiene cierta similitud con la de un proyecto rails, salvando las distancias. Por lo que no sería difícil, una vez diseñado un sitio con Staticmatic pasarlo a una aplicación rails. Sólo necesitaríamos HAML y SASS.

Una vez que tengamos nuestro sitio terminado, lo construiremos en HTML y CSS, en vez de HAML y SASS con:

staticmatic build mi_proyecto


Enlaces relacionados:

jueves, 24 de enero de 2008

Instalar gems en local

A veces es un problema el instalar gemas, entre otras cosas por la máquina en la que está alojada nuestra aplicación. Por ello tenemos que instalarlas en local. ¿Cómo?
  • Creamos el directorio /vendor/gems/
  • Copiamos allí nuestras gemas descomprimidas. En Ubuntu suelen estar en /usr/local/lib/ruby/gems/1.8/gems
  • Metemos esta línea en nuestro /config/environment.rb
    config.load_paths += Dir["#{RAILS_ROOT}/vendor/gems/**"].map do |dir|
    File.directory?(lib = "#{dir}/lib") ? lib : dir
    end
Y ya está!

domingo, 20 de enero de 2008

Autenticación con ActiveLDAP en Ruby on Rails

Para hacer una pruebas he necesitado autenticar contra un servidor LDAP con Rails, pero la verdad que tras buscar y buscar no he encontrado mucha información. Entre las cosas que he encontrado ha sido el plugin Ruby/ActiveLdap (http://www.activeldap.com/).

¿Qué es ActiveLdap?

"Ruby/ActiveLdap provides an object oriented interface to LDAP. This library was inspired by ActiveRecord (both the concept and the library). It maps LDAP entries to Ruby objects with LDAP attribute accessors exposed as methods dynamically assigned based on your LDAP schema and each object’s objectClasses."


Es en esta página (www.activeldap.com) dónde podemos encontrar 2 minitutoriales interesantes:

Con estas librería podemos conectar con un árbol, realizar consultas... pero no son en sí un sistema de autenticación, sino que hemos de implementarlo nosotros mismos. Para mis pruebas me he decantado por utilizar el sistema explicado en 'Practical Rails Social Networking Sites (Expert's Voice)', aunque modificado para que autentique contra un árbol. Tengo claro que no es ni mucho menos el mejor sistema del mundo, pero bueno... para mis pruebas me sirve. Pienso que lo correcto sería modificar acts_as_authenticated y modificarlo para que funcione con este plugin.


lib/authenticate_ldap_system:


module AuthenticateLdapSystem

protected

def is_logged_in?
@logged_in_user = LdapUser.find(:all,:attribute => 'uid', :value => session[:user]) if session[:user]
end

def logged_in_user
return @logged_in_user if is_logged_in?
end

def logged_in_user=(user)
if !user.nil?
session[:user] = user.uid
@logged_in_user = user
end
end

def self.included(base)
base.send :helper_method, :is_logged_in?, :logged_in_user
end

def login_required
unless is_logged_in?
flash[:error] = 'Debe estar autenticado para realizar esta acción.'
redirect_to :controller => 'account', :action => 'login'
end
end

end


controllers/application.rb:

class ApplicationController < secret =""> 'd3ae1ee162786bf4a3ad4fbcabdb4019'

# Hacemos que las contraseñas no salgan en claro en los logs
filter_parameter_logging "password"

# Incluimos nuestro sistema de autenticación
include AuthenticateLdapSystem

end


controllers/login_controller.rb:

class LoginController < logged_in_user =" LdapUser.authenticate(params[:user][:username]," action =""> 'login'
end
end

def logout
if request.post?
reset_session
flash[:notice] = 'Acaba de dejar la zona segura.'
end
redirect_to index_url
end

end


model/ldap_user.rb:

class LdapUser < dn_attribute =""> "uid",
:prefix => "ou=Usuarios",
:classes => ['top'],
:scope => :one

belongs_to :blog, :class => 'Blog', :foreign_key => 'uid'

def self.authenticate(username, password)
ActiveLdap::Base.establish_connection(
:host => "ldap.ejemplo.com",
:port => 389,
:base => "dc=ejemplo",
:bind_dn => "uid=#{username},ou=usuarios,dc=ejemplo",
:password_block => Proc.new { password },
:allow_anonymous => false)

LdapUser.find(:first,:attribute => 'uid', :value => username)

rescue ActiveLdap::AuthenticationError
return null
end

end

Etiquetas