ラベル ruby の投稿を表示しています。 すべての投稿を表示
ラベル ruby の投稿を表示しています。 すべての投稿を表示

2010年3月5日金曜日

rubyでASCII-8BIT~のエラーがでる

どうも、俺@仕事モヤモヤ中です。

rubyでWEBアプリを作っている(僕の環境の場合はUTF-8のアプリ)と
incompatible character encodings: ASCII-8BIT and UTF-8
とか
"\\xE3" from ASCII-8BIT to UTF-8...
Encoding::UndefinedConversionError
みたいなエラーが大量発生して泣きそうになっていました。

ログの通り、文字コードに関するエラーなのですが、だいたい
String.force_encoding("UTF-8")
で回避できます。

特に僕の場合は、sqlite3を使っていたのですが、
ruby-sqlite3モジュールでは、取得データを全てASCII-8BITで保持する実装になっているようで、
Rubyで遊ぶよ Rubyのsqlite3-rubyは必ず文字コードASCII-8BITとして返す
ASCIIなバイト文字列をUTF-8にする際におかしなコードに引っかかっちゃってる系でエラーが出るようです。

ruby-sqlite3の場合は、取得したデータをことごとく .force_encoding("UTF-8")すれば何とかなります。


ちなみに、rubyで文字コード対策としてマジックコメントというものがあります。
#!/usr/local/bin/ruby
# -*- coding: utf-8 -*-
とすれば、文字コードを判別して出力してくれます。


以上どえぇぇぇぇす。

2010年1月23日土曜日

rubyでロジックとビューの分離

どうも、俺@rubyはじめました、です。
Web系の仕事してて、これだけ「ruby」という単語を目にすることが多く「Ruby on railsを真似たフレームワークが・・」と耳にするのでちょっとカジっとかないと、という訳ではじめましたruby。
個人的に「phpとperlとjavaしか知りません」だと対外的に格好つかないかなと思ったわけです。


で、まだまだ勉強し始めなのですが、
WEBアプリを作る際にruby(RoRではない)でロジックとビューを分ける方法について。
例えばphpでは、
// ロジック側(logic.php)
<?php
$a = "foo";
$b = "bar";

require "view.tpl.php";
とロジックを書いておけば、ビューでは
// ビュー側(view.tpl.php)
<html>
<body>
$aの値はです。
$bの値はです。
とできます。

同じようなことをrubyでやるには、
1)ヒアドキュメントを使う
// ロジック側(logic.rb)
a = "foo"
b = "bar"

print "Content-type:text/html\n\n"

print <<__HTML_END__
"<html>
<body>
$aの値は" + a + "です。
$bの値は" + b + "です。"
__HTML_END__

2)ERBを使う
// ロジック側(logic.rb)
require "erb"

print "Content-type:text/html\n\n"

a = "foo"
b = "bar"
tplFile = "view.tpl.html"
erb = ERB.new(File.read(tplFile))
erb.run
としてビュー側で
// ビュー側(view.tpl.html)
<html>
<body>
aの値は<%=a%>です。
bの値は<%=b%>です。
とやります。

というか、もっとスマートな方法あれば教えてください!
もっと勉強します。。

以上っっっっです。