2011-04-14 42 views
15

我正在尋找一種無軌道的簡單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>"; 
} 
?> 

這只是一個簡單的例子,但反映了什麼,我需要用紅寶石做。我不希望所有的rails框架都做這樣的事情。我如何用簡單的ruby代碼實現這一點?

+2

請治好我和其他人的強迫症;本地主機後,你忘記了雙引號。 – Zirak 2011-04-14 14:15:50

+0

@Zirak,你可以編輯別人的問題來解決這個問題。 – 2013-09-15 19:28:54

回答

13

首先,紅寶石是不喜歡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

簡單的答案是sinatra。或者camping

但是,稍微長一點的答案是Ruby不遵循與PHP相同的執行模式,因此「在每個請求中由Web服務器插入的文件中粘貼一些代碼」的開發模型不是以及支持。

+0

沒有框架... – rizidoro 2012-10-22 16:51:35

+1

「沒有Rails」不是「沒有框架!」儘管如此,只需使用WEBrick:http://www.igvita就可以走很長的路。com/2007/02/13/building-dynamic-webrick-servers-in-ruby/ – regularfry 2012-10-23 14:44:08

0

這應該做的工作:

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 
+3

@rizidoro也許你應該說明你的約束是什麼,例如這聽起來像你想使用乘客,所以你應該提前說。這有助於人們給出更接近你想要的答案。 – Kelvin 2011-04-14 15:28:10

2

我知道的最簡單的方法是使用Ruby的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的開銷,併爲複雜你將需要一個模板機制。