Создание веб-страницы с рубином без рельсов - PullRequest
15 голосов
/ 14 апреля 2011

Я ищу способ сделать простой код ruby ​​без рельсов. Я из мира PHP, и иногда я просто создаю страницу с подключением Mysql, запускаю запрос и показываю результат в простой таблице (например, в простом журнале или отчете). Пример:

<?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>";
}
?>

Это простой пример, но он отражает то, что мне нужно сделать с ruby. Я не хочу, чтобы вся структура рельсов просто делала что-то подобное. Как я могу добиться этого с помощью простого кода ruby?

Ответы [ 4 ]

13 голосов
/ 14 апреля 2011

Во-первых, Ruby не похож на php.Не надо помещать файлы в public_html и ожидать, что все будет работать.

Тем не менее, это возможно сделать, вроде как.Поэтому мы используем адаптер Mysql без ORM, как это делает php по умолчанию.

Перед началом вам понадобится адаптер mysql, поэтому установите его с помощью:

gem install mysql2

Чем написать что-то вроде:

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>"}

Теперь запустите его в консоли с

ruby name_of_the _file.rb

Это выведет записи в консоли.Если вы хотите выводить из браузера, вам нужно написать небольшой сервер:

#!/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

Теперь, когда вы выполните ruby application.rb, сервер будет запущен на порту 6789 и будет выводить необходимые данные.Позже вы можете изменить прокси на нем и использовать его на порту 80.

5 голосов
/ 14 апреля 2011

Простой ответ: sinatra .Или camp .

Однако, более длинный ответ заключается в том, что Ruby не следует той же модели выполнения, что и PHP, поэтому модель разработки «вставляет некоторый код в файл для интерполяции».веб-сервером по каждому запросу "не так хорошо поддерживается.

2 голосов
/ 14 апреля 2011

Самый простой способ, который я знаю, - это использовать модуль CGI Руби и запустить скрипт как CGI.В зависимости от ваших требований к производительности и сложности страницы, которую вы хотите сгенерировать, что-то вроде этого может просто сработать:

#!/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']}" }
    }
  }
}

Возможно, вы захотите рассмотреть накладные расходы на установление соединения с MySQL при каждом запросе, идля сложных страниц вам понадобится шаблонизатор.

0 голосов
/ 14 апреля 2011

Это должно сделать работу:

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

Перед запуском необходимо установить activerecord:

gem install activerecord
...