SQLの窓

2018年05月16日


Ruby 2.4 で GET/POST メソッドを想定した CGI 用のテンプレート改良版( FORM で MySQL 参照と更新 )

Ruby 2.4.0 リファレンスマニュアル



以前の単純な表示するだけのテンプレートは『Ruby 2.4 で GET/POST メソッドを想定した CGI 用の簡易テンプレートを作成してみました』です


テンプレートの要点

1) メイン / 共有メソッド / 画面 のソース分割

Ruby は単純にグローバル変数が各ソースで共有できたので、それらでコントロールしています。

2) fields() と forms() の画面埋め込み

上記2メソッドで FORM 内の入力値のコントロールをしています

※ $fld_names を定義し、日本語でフィールドを参照するようにしてソースを読みやすくしています。

メイン
# **************************************
# https://docs.ruby-lang.org/ja/latest/method/Array/i/unshift.html
# ライブラリ参照にカレントを追加
# **************************************
$:.unshift File.dirname(__FILE__)

# **************************************
# http://www.tmtm.org/ruby/mysql/
# gem install ruby-mysql
# **************************************
require 'mysql'

# **************************************
# カレントのファイルを読み込み
# **************************************
require 'my_func'

# **************************************
# 使用するライブラリ
# **************************************
require 'cgi'
require 'pp'

# **************************************
# グローバル変数
# **************************************
$error_flg = 0
$error_msg = ""
$check_message = ""
$fld_names = {}
$base_path = __FILE__

cgi_init

# **************************************
# 接続
# **************************************
begin
	connection = Mysql.connect("127.0.0.1", "root", "", "lightbox")
	rescue => ex
		print "<pre>"
		print format("%d エラーが発生しました\n%s\n",ex.errno,ex.error);
		puts "--------------"
		p ex.instance_variables
		p ex.to_s
		p ex.message
		print "</pre>"
		p ex.error
		# 接続エラーの場合は終了
		exit!
end

# **************************************
# フィールド参照の定義
# **************************************
$fld_names = {
	"確認" => "send1",
	"送信" => "send2",
	"社員コード" => "key",
	"氏名" => "field1",
	"フリガナ" => "field2"
}

# **************************************
# 第一パス( MySQL 参照 )
# **************************************
if forms("確認") == "確認" then

	$check_message << "確認が押された"

	sql = <<-SQL
	select * from 社員マスタ
		where 社員コード = '#{forms("社員コード")}'
	SQL

	$check_message << " : " << sql

	begin
		result = connection.query(sql)
		row = result.fetch_row()

		forms("氏名", row[1])
		forms("フリガナ", row[2])

			# エラー処理
	rescue => ex
	end

end

# **************************************
# 第ニパス( MySQL 更新 )
# **************************************
if forms("送信") == "送信" then

	$check_message << "送信が押された"
	sql = "update 社員マスタ set 氏名 = '#{forms("氏名")}', フリガナ = '#{forms("フリガナ")}' where 社員コード = '#{forms("社員コード")}'  "

	$check_message << " : " << sql

	begin
		result = connection.query(sql)

		# エラー処理
	rescue => ex
	end

end


# **************************************
# 画面定義
# **************************************
require 'my_view'


# **************************************
# cgi データの確認
# **************************************
print "<div style='margin-top:30px;'>-------------------------------------</div>"
pp $params

# **************************************
# select の結果を CSV 形式の文字列で取得する
# **************************************
print "<pre>"
print "<div style='margin-top:30px;'>-------------------------------------</div>"
print get_csv(connection,"select * from 社員マスタ")
print "</pre>"

# **************************************
# 接続解除
# **************************************
connection.close

# **************************************
# get_csv のエラー
# **************************************
if $error_flg != 0 then
	print "<div style='margin-top:30px;'>-------------------------------------</div>"
	print format("%d エラーが発生しました\n%s",$error_flg,$error_msg);
end


インデント ヒアドキュメント( <<-識別子 )

※ ドキュメントの参照
if forms("確認") == "確認" then
	$check_message << "確認が押された"
	sql = <<-SQL
	select * from 社員マスタ
		where 社員コード = '#{forms("社員コード")}'
	SQL
end
開始ラベルを <<-識別子 のように - を付けて書くことで終端行をインデントすることができます。さらに、<<~識別子 を使用すると、最も小さなインデントに合わせて行頭のスペースを削除します。 共有メソッド( my_func.rb )
=begin
	※ 前方参照の関数を require

	select の結果を CSV 形式の文字列で取得する
=end
# **************************************
# select データの確認
# **************************************
def get_csv(connection,sql)

	# $ は グローバルスコープの変数
	$error_flg = 0
	$error_msg = ""

	str_row = ""
	begin
		result = connection.query(sql)
		result.each do |fld|
			len = fld.length
			for data in fld do
				# 文字列追加
				str_row << "#{data},"
			end
			# 最後のカンマを取り除く
			str_row.chop!
			# 次の行の為改行( 文字列追加 )
			str_row << "\n"
		end
	# エラー処理
	rescue => ex
		$error_msg = ex.error + "\n"
		$error_flg = ex.errno
	end

	return str_row

end

# **************************************
# CGI 処理
# **************************************
def cgi_init

	$cgi = CGI.new
	
	puts "Content-Type: text/html; charset=utf-8"
	puts  "Expires: Thu, 19 Nov 1981 08:52:00 GMT"
	puts "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
	puts "Pragma: no-cache"
	puts
	
	#pp $:
	
	$params = $cgi.params

end

# **************************************
# FORM 用変数の参照と設定
# **************************************
def forms( target, setter=nil )

	result = ""

	key = $fld_names[target]

	if not setter.nil? then
		$params[key][0] = setter
		return
	end

	if not $params[key].empty? then
		result = $params[key][0]
	end

	return result

end

# **************************************
# フィールド用文字列の参照
# **************************************
def fields( target )

	return $fld_names[target]

end



画面( my_view.rb )
# **************************************
# 画面定義
# **************************************
out_client = <<HTML
<!DOCTYPE html>
<html>
<head>
</head>
<body>
	<h4>#{$check_message}</h4>
	<a href="#{File.basename($base_path)}">GET 再読み込み</a>
	<form method="post">
		<p>
			社員コード : <input type="text" name="#{fields("社員コード")}" value="#{forms("社員コード")}">
			<input type="submit" name="#{fields("確認")}" value="確認">
		</p>
		<p>
			氏名 : <input type="text" name="#{fields("氏名")}" value="#{forms("氏名")}">
		</p>
		<p>
			フリガナ : <input type="text" name="#{fields("フリガナ")}" value="#{forms("フリガナ")}">
		</p>
		<p>
			送信 : <input type="submit" name="#{fields("送信")}" value="送信">
		</p>
	</form>
</body>
</html>
HTML

print out_client


AN HTTP Server の設定




テストにはまだまだ使える(重宝する) AN HTTP Server の正しい使用方法




posted by lightbox at 2018-05-16 23:53 | Ruby 2018 | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり