2013年5月23日 23:32:08
apache2 ちゃんに cgi(.rb) をできるようにしておく(これもメモにしようと思ったけどどう httpd.conf したかわからない・・・)。
(a href="javascript:ajaxruby();")ここをクリック(/a)して cgi(.rb) に飛ばし、データが返ってきたらテキストを変える
ということをやってみたので、そのメモです。
まず test.rb を apache2 の cgi 設定フォルダ (cgi-bin/) の中に保存する。
test.rb
#!C:/Ruby193/bin/ruby.exe
# encoding: utf-8
print "Content-Type:text/html\r\n\r\n"
require "cgi"
cgi = CGI.new
cp = cgi.params["x"]
print cp
最初の1行目は ruby 本体のファイルパス。 path を通してれば ruby だけでいいはず。(ググってチラ見なので詳しい記述はわかりませんw)
2行目 test.rb の文字コード
print "Content-Type:text/html\r\n\r\n"
に関しては、
http://d.hatena.ne.jp/tilfin/20080118/1200653984さんのブログより。
ruby の cgi の情報が少なすぎてやっと辿り着いたのがココでした。ありがとうございます!動きました!
cp = cgi.params["x"]
この1行にどんだけ時間費やしたことかwwwwwwwwwwww
最初はよくわからんまま、POST で送信してたんだ。POST ってかっこいいじゃん?
しかし html の a href で javascript で飛ばすんだから、 name=" " ってどうすればいいのかわからないので、
params[" "] ←ここがどうもわからなかった。
数時間、いや数日かかっただろうな。自力ですからwプログラミングなど独学の知識。経験も何もない。
そこで GET にしてみよう!と、よく気づいたよw
cp という変数に GET で送られてきた値を入れている
そして最後に print でいいのか知らんが値を返却できたので、 print cp
以下のコードは
http://allabout.co.jp/gm/gc/24097/#2を少し改良。
test.php の中の javascript
function requestTest ( data , method , async ) {
var rq = new XMLHttpRequest();
var filename = "test.rb";
if ( method == "GET" ) URI = "../cgi-bin/" + filename + "?x=" + data;
rq.open ( method , URI , async );
rq.onreadystatechange = function() {
if ( rq.readyState == 4 ) {
on_loaded ( rq );
}
}
if ( method == "GET" ) data = null;
rq.send ( data );
}
function on_loaded( rqobj ) {
res = rqobj.responseText;
alert ( res );
}
rq で XMLHttpRequest オブジェクト作成
filename に cgi ファイルの名前
if ( method 略 は、最初POSTでやってたんで、付け加えました。この状態でPOSTで送ると、URI 変数が GET のみに生成されているのでエラーになります。
+ "?x=" + data; これで、cgi に、x=data を送っています。
URI = cgi-bin/test.rb?x=data; の状態になっています。
rq.open ( method , URI , async );
open は 初期化。この3つでおk。
method は "POST" か "GET"
URI はそのまんま 送信先。ここもうまくいかず悩みました。このtest.php からみた相対パスです。※実際のファイルパスじゃなく、WEB上でのパス。この場合、1個上のフォルダのcgi-bin/test.rb 。
async は非同期とうい訳。 true か false 。この場合は true です。
rq.onreadystatechange はサーバーとの通信状態が変化したら、onreadystatechangeが呼び出されます。
コピペなのでこの辺はようわからんwwwww。
if ( method == "GET" ) data = null;
rq.send ( data );
これは、GET である場合、deta は null にしないといけません。
data を送信します。
if ( rq.readyState == 4 ) {
on_loaded ( rq );
}
function on_loaded( rqobj ) {
res = rqobj.responseText;
alert ( res );
}
readyState は
0 未初期化
1 読み込み中
2 読み込み済み
3 処理中
4 完了
4 であるとき on_loaded ( rq ) を実行、オブジェクトを渡す。
res = rqobj.responseText テキストデータとして res に渡す。
値を受け取ることができたので、
これを利用して DOM をすればおっけえええい。
すっげええええ日数かかった。まずルビーで死んだ。その後、どうやったらデータを受け取れるのかわからなかった。
ググって出てきてよかった;;ありがとうv
test.php の中の a href による javascript 呼び出し
<a href="javascript:requestTest('test', 'GET' , true );">ここをクリックしてね!</a>