2011-04-14 10 views
15

Estoy buscando una forma de hacer código ruby ​​simple sin rieles. Vengo del mundo de PHP y, a veces, solo construyo una página con una conexión Mysql, ejecuto una consulta y muestro el resultado en una tabla simple (por ejemplo, un simple registro o informe). Ejemplo:Haciendo una página web con ruby ​​sin rieles

<?php 
$con = mysql_connect("localhost","user","pass"); 
mysql_select_db("mydb"); 

$query = mysql_query("SELECT * FROM users"); 

while($data = mysql_fetch_assoc($query) { 
    echo "<p> $data[name] - $data[age] </p>"; 
} 
?> 

Esto es sólo un ejemplo sencillo, pero refleja lo que tengo que hacer con el rubí. No quiero que todos los frameworks de rails hagan algo como esto. ¿Cómo puedo lograr esto con un simple código ruby?

+2

Cura mi TOC y el de cualquier otra persona; Olvidaste una comilla doble después de localhost. – Zirak

+0

@Zirak, puedes editar la pregunta de otra persona para arreglar cosas como esa. –

Respuesta

13

En primer lugar, Ruby no es como php. No se pierden archivos en public_html y se espera que todo funcione.

Sin embargo, es posible hacerlo de esa manera, un poco. Así que estamos usando el adaptador Mysql sin ORM ya que php lo hace de forma predeterminada.

Antes de empezar, necesitará adaptador de MySQL, por lo que instalarlo con:

gem install mysql2 

Que escribir algo como:

require "rubygems" 
require "mysql2" 

client = Mysql2::Client.new(
    :host => "127.0.0.1", 
    :username => "root", 
    :password => "", 
    :database => "mydb" 
) 
records = client.query("SELECT * FROM users") 

records.each {|r| p "<p>#{r['name']} - #{r['age']}</p>"} 

Ahora ejecutarlo en la consola con

ruby name_of_the _file.rb 

Esto generará registros en la consola. Si desea que la salida del navegador, tendrá que escribir un pequeño servidor:

#!/usr/bin/ruby 
require 'rubygems' 
require 'socket' 
require 'mysql2' 

webserver = TCPServer.new('127.0.0.1', 6789) 

client = Mysql2::Client.new(
    :host => "127.0.0.1", 
    :username => "root", 
    :password => "", 
    :database => "mydb" 
) 

records = client.query("SELECT * FROM users") 

while (session = webserver.accept) 
    session.print "HTTP/1.1 200/OK\r\nContent-type:text/html\r\n\r\n" 
    request = session.gets 
    records.each {|r| session.print "<p>#{r['name']} - #{r['age']}</p>"} 
    session.close 
end 

Ahora cuando haces ruby application.rb, el servidor se iniciará en el puerto 6789 y va a datos de salida requerida. Más adelante puede invertir el proxy y usarlo en el puerto 80.

5

La respuesta simple es sinatra. O camping.

Sin embargo, la respuesta ligeramente más larga es que Ruby no sigue el mismo modelo de ejecución que PHP, por lo que el modelo de desarrollo de "pegar código en un archivo para ser interpolado por el servidor web en cada solicitud" no es también apoyado.

+0

sin marco ... – rizidoro

+1

"Sin rieles" no es "sin marco"! Sin embargo, puede recorrer un largo camino con solo WEBrick: http: //www.igvita.com/2007/02/13/building-dynamic-webrick-servers-in-ruby/ – regularfry

0

Esto debería hacer el trabajo:

require 'rubygems' 
gem 'activerecord'; require 'active_record' 

class User < ActiveRecord::Base 

end 

ActiveRecord::Base.establish_connection(
    :adapter => 'mysql', 
    :database => 'test', 
    :user => 'user', 
    :password => 'pass' 
) 

User.all.each do |u| 
    puts "<p>#{u.name} - #{u.age}</p>" 
end 

antes de ejecutarlo es necesario instalar activerecord:

gem install activerecord 
+3

@rizidoro Quizás debería indicar cuáles son sus limitaciones, p. parece que quiere usar Passenger, por lo que debe mencionarlo por adelantado. Eso ayuda a las personas a dar respuestas más cerca de lo que quieres. – Kelvin

2

La forma más sencilla que conozco es utilizar el módulo CGI de Ruby y ejecutar el script como CGI. Dependiendo de los requisitos de rendimiento y la complejidad de la página que desea generar, algo como esto sólo podría hacer el truco:

#!/usr/bin/ruby 
require 'cgi' 
require 'mysql' 

con = Mysql.new("localhost","user","pass","mydb") 
rs = con.query('select * from users') 

cgi = CGI.new('html4') 
cgi.out { 
    cgi.html { 
    cgi.body { 
     rs.each_hash { |row| puts #{"row['name']} - #{row['age']}" } 
    } 
    } 
} 

que le gustaría tener en cuenta la sobrecarga de establecer conexión con MySQL en cada solicitud, y para el complejo páginas necesitará un mecanismo de plantillas.

Cuestiones relacionadas