Rails

De Hecpeare

Rails en TWiki

Notas viejas y posiblemente desactualizadas. Algo más actualizado: Subversion, MySQL, Deployment

¿Qué es Rails?

http://api.rubyonrails.org/

Tabla de contenidos

[editar] Instalación

Ver también wiki/Deployment

[editar] MySQL

sudo aptitude install mysql-server libmysql-ruby

Cambiamos la contraseña

mysqladmin -u root password NUEVO_PASSWORD

Reiniciamos el servidor de MySQL:

sudo /etc/init.d/mysql restart

Crear base de datos

mysqladmin -u NOMBRE_USUARIO -p create NOMBRE_BASE_DATOS

[editar] Ruby

sudo aptitude install ruby ruby1.8 ruby1.8-dev rdoc ri irb

[editar] RubyGems

wget http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
name='rubygems-0.9.4'
tar zxvf $name.tgz
cd $name
sudo ruby setup.rb
cd ..
rm $name.tgz
rm -fr $name

[editar] Rails

sudo gem install rails

[editar] Notas

[editar] varias bases de datos

Ver esto, esto, esto y

[editar] mongrel

mongrel_rails start -e production -p 3003 -d

[editar] OpenID

[editar] Instalar

gem install ruby-openid

[editar] Ejemplos

Un poco de todo.

Ejemplo de Ben Curlis. Otros ejemplos un poco más viejos.

[editar] Sólo openid, no dar opción a contraseña

ver esto

rails your_app
cd your_app
mysqladmin -u USUARIO -p create pr_development
sudo gem install openid_login_generator -y
script/generate openid_login openid_account

Modificamos app/controllers/application.rb:

require_dependency "openid_login_system"
class ApplicationController < ActionController::Base
  include OpenidLoginSystem
  model :user
  # Pick a unique cookie name to distinguish our session data from others'
  session :session_key => '_pr_session_id'
end
script/generate migration create_user_model

Modificamos db/migrate/001_create_user_model.rb

class CreateUserModel < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.column :openid_url, :string
    end
  end
  def self.down
    drop_table :users
  end
end
rake db:migrate

[editar] Gráficos con Gruff

[editar] Instalación

sudo gem install gruff

y según esto instalamos rmagick:

sudo apt-get remove --purge librmagick-ruby-doc librmagick-ruby1.8
sudo apt-get install libmagick9-dev ruby1.8-dev
sudo gem install rmagick


Me ha dado problemas instalarlo en local

[editar] Enlaces

[editar] Ejemplos

de aquí:

 #!/usr/bin/ruby
 
 require 'rubygems'
 require 'gruff'
 
 g = Gruff::Line.new
 g.title = "My Graph" 
 
 g.data("Apples", [1, 2, 3, 4, 4, 3])
 g.data("Oranges", [4, 8, 7, 9, 8, 9])
 g.data("Watermelon", [2, 3, 1, 5, 6, 8])
 g.data("Peaches", [9, 9, 10, 8, 7, 9])
 
 g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
 g.write('my_fruity_graph.png')
imag (quedaría bien ;)

y aquí:

 #Here's how to make a Pie graph:
 
 g = Gruff::Pie.new
 g.title = "Visual Pie Graph Test"
 g.data 'Fries', 20
 g.data 'Hamburgers', 50
 g.write("test/output/pie_keynote.png")
 
 #To control where the pie chart starts creating slices, use #zero_degree.

[editar] Exportar a excel

sudo gem install spreadsheet-excel

[editar] Zona Horaria

basta instalar la gema tzinfo y el plugin tzinfo_timezone:

  gem install tzinfo
  ruby script/plugin install tzinfo_timezone

y ahora para convertir:

  time=Time.now # , g.created_at o lo que sea
  TimeZone['Madrid'].utc_to_local(time.utc)

Algunos comentarios aquí y aquí

Para que pueda ser configurable por el usuario añadimos la columna timezone en la tabla de usuarios:

     t.column :time_zone, :string

y en el form_for que queramos (posiblemente en la vista donde se crean/editan los usuarios):

     <%= form.time_zone_select :time_zone %>

[editar] Anotar modelos

Instalar el plugin annotate_models:

ruby script/plugin install http://svn.pragprog.com/Public/plugins/annotate_models

[editar] ... Excel

Instalar...

ACABAR

[editar] Idiomas

HowToMakeRailsMultilingual

  gettext o globalize

algunos comentarios

Para traducir a un sólo idioma: Localization Simplified

[editar] Usar link_to dentro de una vista para generar correos electrónicos, con ActionMailer

No he encontrado mucho sobre el tema. Por ahora lo he resuelto con la constante BASE_URL en environment.rb, que la utilizo para pasarle el host a link_to:

<%=link_to(nil,{:host => BASE_URL,:controller=>:admin, :action=>:password_change, :id=>@aleat, :only_path => false},:method=>:post)%>

[editar] Dreamhost

(servidor para pruebas, aunque ya no lo uso)

wiki de dreamhost, Instalar gemas, Subversion, Capistrano

[editar] Varios

[editar] scripts

[editar] resetea.sh

rake db:migrate VERSION=0
rake db:migrate
rake annotate_models
#rake db:test:prepare
#rake db:fixtures:load
rm public/images/tmp/*
rm public/images/tmp_*
ruby script/server
#mongrel_rails restart

[editar] actualiza.sh

Tenemos tres carpetas:

  • RUTA_EMPLISTEN_LOCAL
  • RUTA_ARCHS_A_SUSTITUIR Archivos que van en el servidor que son diferentes a los usados en local:
    • public
      • .htaccess
      • dispatch.fcgi
    • config
      • database.yml
      • environment.rb
  • RUTA_EMPLISTEN_A_SUBIR

Vamos a copiar RUTA_EMPLISTEN_LOCAL a RUTA_EMPLISTEN_A_SUBIR y luego sustituimos los archivos que van a ser diferentes de RUTA_ARCHS_A_SUSTITUIR a RUTA_EMPLISTEN_A_SUBIR

(Sí, chapucero comparado con usar subversion o capistrano, pero para empezar...)

  echo '----> copiamos'
  rsync -avz --delete RUTA_EMPLISTEN_LOCAL/* RUTA_EMPLISTEN_A_SUBIR
  echo '----> modif arch'
  cp RUTA_ARCHS_A_SUSTITUIR/* RUTA_EMPLISTEN_A_SUBIR -r
  
  echo '----> a dreamhost'
  rsync -avz --delete --stats --progress RUTA_EMPLISTEN_A_SUBIR/* USUARIO@www.hecpeare.com:RUTA_EMPLISTEN_SERVIDOR

[editar] Otras notas

  • logger.info("eooooooo")

Hmm..I've been using

killall -USR1 ruby

killall -USR1 dispatch.fcgi

rake db:migrate RAILS_ENV=production


Si est�s en la m�quina de producci�n y usas linux(con bash) puedes poner en el fichero ~/.bashrc lo siguiente para que todos los comandos que ejecutes los haga en el entorno de producci�n: export RAILS_ENV=production

Adem�s de ser m�s "prolijo", te va a dar la ventaja de, por ejemplo, que los controles se llenen autom�ticamente en el formulario de creaci�n.

 class Producto < ActiveRecord::Base
   def initialize
     super
     self.costo ||= 0.0
     self.pais ||= Pais.find(:first)
   end
 end





before_filter { comprueba_permiso? 10 }

before_filter { comprueba_permiso? 20 }

@n_q.times { |n| instance_variable_set("@mtask#{n}".to_sym, Mtask.new(params["mtask#{n}"])) }








[editar] Problemas a resolver

  def before_save
    self.thank_with_pie_graph=0#si uso false o quito self no va. ¿pq? ¿no es método de instancia?
  end

y tb (poco después, en mtask)

  self.tasks_rest-=1 #rev pq hace falta el self (mm sino no va, pero es una instancia...)
  • Cuando foreign_key en las migraciones
  • A veces al hacer, por ej, mtask.tasks[0].mtask da problemas.-- 14:39 25 may 2007 (PDT)
    • En show_comments.rhtml al intentar usar la template _task.rhtml
    • En show_comments.rhtml en <div id="task_sender">
    • modelo task, método sender. ¿Pq no va mtask.user?? (tras añadir el has_many y el belongs_to)




  • lib/array_extension.rb
#module TempModule ; si lo pongo no va, rev pq (puede q pq al dar un espacio de nombres...)
#uf la cantidad de accesos a la bbdd. Arreglar.
module ArrayExtension
   def all
     map {|x| [x.name, x.id] } #mm no se podrá pedir una col entera??? (para q no hayan tantos accesos)
   end
   def names
     map {|x| x.name } # ¿pq con echo no va y tenia q poner: a=[]; map {|x| a<<x.name };a?
   end    
   def jnames
     names.join(", ")
   end
end
#end
  • Modelo task
 def sender
   u=mtask.gmtask.user_id
   User.find(u) if u #Rev pq no va simplem: mtask.user (tras añadir el belong_to y el has_many...). 
#La 1ª vez q se recarga la pag va, pero luego las dependencias...
 end

[editar] Enlaces

wiki.rubyonrails.org sobrerailes.com wiki.onrails.com.ar

[editar] Deployment

Ver mejor wiki/Deployment

[editar] Install deprec

from deprec.org

install with rubygems

sudo gem install deprec --include-dependencies   # installs what you need (including capistrano-1.4.1)

update to latest version

sudo gem update deprec

Deprec doesn't (yet) work with Capistrano 2

When using deprec, you need to use cap1, which can happily coexist with cap2 if you have a way of calling it.

Put the following into your bash environment (~/.bash_login on OSX, ~/.bashrc on Ubuntu)

alias cap1="`which cap` _1.4.1_"


This loads the deprec recipes into Capistrano *except* when using Cap2.

echo "require 'deprec/recipes' unless respond_to?(:namespace)" >> ~/.caprc # include deprec recipes
cap1 show_tasks  # should now include deprec tasks

[editar] Install deprec

from slicehost.com

[editar] deploy.rb

[editar] start with cap

cap setup_admin_account_as_root

Password:

[root password]

Enter userid for new user:

[hector or deploy or ...]

Enter new UNIX password: :

[pick one] <<-- remote_user_password
cap setup_ssh_keys
<<--remote_user_password

[editar] mm

...

Herramientas personales