Ruby1.8.7以降ではtruncateメソッドの仕様が変わったらしくエラーが起きる
『基礎Ruby on Rails』を手にウェブアプリケーション "Morning Glory" を作成していたわけですが、第6章のデータを MySQL にインポートしたら以下のようなエラーが生じてしまいました。
1 2 | NoMethodError in Main#index undefined method `length' for #<Enumerable::Enumerator:0xb676c440> |
問題の「Main#index」ってのは以下の RHTML ファイルです。どうやらこれの8行目にある truncate メソッドが引っかかっているご様子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <% @side_bar_template_name = 'side_bar' -%> <div id="whats_new"> <h2>What's New</h2> <ul> <% @new_articles.each do |a| -%> <li><%= link_to h(a.heading), :action => a.place, :anchor => "article_#{a.id}" %> <%= truncate(h(a.body), 20) %></li> <% end -%> </ul> </div> <div id="main"> <% @top_articles.each do |a| %> <h2><%= h(a.heading) %></h2> <%= simple_format(h(a.body)) %> <% end -%> </div> |
結論から言うと、これは Ruby のバージョンというか仕様に対してもともとのコードが噛み合ってないのが原因のようです。解決策は以下のとおり。
解決策はずばり、「\config\environment.rb の末尾1に修正コードを書き込む」です!2
そしてその修正コードはこちら。
1 2 3 4 5 6 7 8 9 10 11 | module ActionView module Helpers module TextHelper def truncate(text, length = 30, truncate_string = "...") if text.nil? then return end l = length - truncate_string.chars.to_a.size (text.chars.to_a.size > length ? text.chars.to_a[0...l].join + truncate_string : text).to_s end end end end |
もともと Ruby には TextHelper#truncate メソッドが用意されているわけですが、それを定義し直すコードのようですね。
def truncate 以降を抽出した部分(以下のコード)を \app\helpers\application_helper.rb に加えても同じように動くみたいです。
1 2 3 4 5 | def truncate(text, length = 30, truncate_string = "...") if text.nil? then return end l = length - truncate_string.chars.to_a.size (text.chars.to_a.size > length ? text.chars.to_a[0...l].join + truncate_string : text).to_s end |
注意点としては、これをやっちゃうと Ruby デフォルトの truncate メソッドが使えなくなるというのがあります。もしデフォルトの truncate メソッドが使えないと困るとかいう場合は他の方法を探す必要がありそうです。
『基礎Ruby on Rails』に沿って Rails を勉強している方の内けっこうな方がこのエラーにやられると思われますので、このエントリが一助となれば幸いです。
- 1 なんで末尾じゃないとダメなんでしょうね?
- 2 参考:『基礎Ruby on Rails』 読者サポートページ – Ruby on Rails with OIAX、ruby 1.8.7 では Rails 1.2.x の truncate が動かない – tkrdの日記 (rails や ubuntu のことなど)
よろしければ以下の関連(してそうな)記事もどうぞ!
- Railsで次のエラーへの対処法:We’re sorry, but something went wrong.
- Railsのfindで複数のテーブルから検索する:includeでeager loading
- RailsのWEBrickサーバを強制的に停止する方法
- Rubyで1からnまでの整数をランダムに並び替える(処理速度の比較まで)
- WordPressでシンタックスハイライト:WP-Syntaxを使ってみた
![[画像] 今日の気になる記事「きにきじ」QR Code](http://www.kagitaku.com/diary/images/qrcode.png)
![[画像] きにきじ Feed](http://www.kagitaku.com/diary/images/Newspaper_Feed_128x128_ie6.png)
![[画像] kagitaku.com ロゴ](http://www.kagitaku.com/common/images/logo.png)





![[画像] 最上部へ](http://www.kagitaku.com/common/images/pageNavi-toTop.png)
![[画像] 最下部へ](http://www.kagitaku.com/common/images/pageNavi-toBottom.png)
![[画像] 履歴を戻る](http://www.kagitaku.com/common/images/pageNavi-back.png)
![[画像] 履歴を進む](http://www.kagitaku.com/common/images/pageNavi-forward.png)
![[画像] Contact](http://www.kagitaku.com/common/images/pageNavi-contact.png)
![[画像] Sitemap](http://www.kagitaku.com/common/images/pageNavi-sitemap.png)