チケットを更新するとエラーになってうまくできないと連絡きました。
最終的には上手く対応できました。
ログを見ると ActiveRecord::StatementInvalid (Mysql::Error: #HY000Incorrect string
value: '\x
というエラーで
長いテキストのカスタムフィールドで文字列によってエラーになってしまう場合がある - Redmine Users (japanese) | Google Groupsと同じ内容でした。
app\models\journal_detail.rb を以下のように修正し、redmine再起動しました。
# self.value = value[0..254] if value && value.is_a?(String)
self.value = value[/.{0,254}/m] if value && value.is_a?(String)
# self.old_value = old_value[0..254] if old_value && old_value.is_a?(String)
self.old_value = old_value[/.{0,254}/m] if old_value && old_value.is_a?(String)
たぶん、ruby 1.9系では発生しないと思います。
と書くと短いですが、実際は4時間くらい格闘してました。
最初はエラーログをもとに、google検索をかけて、redmine users にすぐたどりついたのですが、
解決策が書いてませんでした。
しかたないので、さらにエラーログで検索しても特になしです。
しょうがないので redmine usersの情報をよく読むと、255バイト目がおかしいとあります。
文字列処理のはずなのに、バイトということは、マルチバイト文字列処理をバイト扱いしてるはずです。
最初に確認したのはデータを保存する箇所です。
エラーログから、journal_details 関連だなとわかって、まずDBの文字コードか?
と思いました。MySQLなんて詳しくないので、また検索。
MySQL 文字化けを防ぐ、文字コードの確認と設定 | 渋谷生活MySQL: 既存テーブルの構造の変更 - ALTER TABLE文、CHANGE COLUMN句 - Yukun's Blogをもとに、コマンドラインから確認しても問題なさそう。MySQL 5.0.9 のデフォルトUTF-8なのでよし。
文字列をカットしないでよいように、1000文字とかしようと思ったけど、
VARCHARなので指定してある255以上にはできない。
そもそも255バイトということなので、文字数としては申し分ないはず。
やはり、255 バイトでカットしている箇所を特定するしかない。
ということで、255バイトに関連するソースと特定、
キーワードとして 255 や254 で検索して、もっともそれっぽいのが、
app\models\journal_detail.rb
self.value = value[0..254] if value && value.is_a?(String)
self.old_value = old_value[0..254] if old_value && old_value.is_a?(String)
で? 何ですかこれは? ruby 全然知らないんですけど。
googleの検索キーワードもわからない。
しょうがないので、以前デブサミでMatzさんにサインもらった
を初めて開いてみる。
なるほど、Ruby 1.8では文字列操作はバイト単位、文字列単位が混じる。
Ruby 1.9 ではUTF-8そのまま通る。
それで? あきらめて ruby 文字列 短縮 などで検索。
String - Rubyリファレンスマニュアルjcode - Rubyリファレンスマニュアルうーん。ずばりはない。
Rubyでの日本語文字列処理うーん。長いメソッド。いや。split している。ということは join もある?ということで。
self.value = value.split(//u)[0..254].join() if value && value.is_a?(String)
をー!うまくいった。
しかし今ひとつかっこわるいような。もう少し検索。
rubyで日本語文字列を指定文字数切り出す - Ryoの開発日記あーこれですね。あれうまくいかない。{10}だと10番目だけ??改行消える?
で、
self.value = value[/.{0,254}/m] if value && value.is_a?(String)
速度は変わらない感じ。まあ従来の雰囲気は近いのでこれで終了。
知識がないのは辛い。
環境:
OS:windows XPsp3/ 2003 sp
ruby:1.8.6
rails:2.0.2 ?
redmine : 0.8.7
コメントの投稿