Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事にトラックバックする(FC2ブログユーザー)
http://burnlight.blog3.fc2.com/tb.php/371-dc96814a

トラックバック

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

redmineで、チケット更新エラーになってしまうのを解決しました。

チケットを更新するとエラーになってうまくできないと連絡きました。

最終的には上手く対応できました。

ログを見ると 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プログラミング言語 Ruby
(2009/01/26)
まつもと ゆきひろDavid Flanagan

商品詳細を見る

を初めて開いてみる。
なるほど、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
スポンサーサイト
この記事にトラックバックする(FC2ブログユーザー)
http://burnlight.blog3.fc2.com/tb.php/371-dc96814a

トラックバック

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

Appendix

プロフィール

burnlight

  • Author:burnlight
  • 忘れないように色々メモします。

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。