« [日記] 気分悪い | トップページ | [Ruby] 更に Rails 3e の続き »

2009年5月 2日 (土)

[Ruby] Rails 3e の続き

Ruby 1.9.1 + Rails 2.3.2 の組み合わせで試しながら読んでいたら 16.9 Unicode Support のところでつまずく。 String#chars は、Enumerator で length というメソッドも reverse というメソッドも持ってない。

普通にindex.html.erbの中で

<td><%= person.name.reverse %></td>

とかやってみたら

invalid byte sequence in UTF-8

とか言われた。

試しに、

<td><%= person.name.encoding %></td>

としたら、ASCII-8BIT と表示した。

そこで、

<td><%= person.name.encode('UTF-8') %></td>

としたら 

"\xE3" from ASCII-8BIT to UTF-8 

とエラー(ちなみに、person.name は、テストのために「あ」にしている)。

そこで、

<td><%= person.name.force_encoding('UTF-8') %></td>

としてみたら

incompatible character encodings: ASCII-8BIT and UTF-8

とエラーになった。

しばらく悩んでいたのだが、原因がわかった。 Person#nameを参照するところで全てforce_encoding('UTF-8')すれば、よさそうである。

ということで Person.rb は

class Person < ActiveRecord::Base
  def name
    super.force_encoding('UTF-8')
  end
end

と逃げて、更に駄目駄目だけど、よくわかんなかったので、index.html.erb は

<table border="1">
  <tr>
    <th>Name</th><th>Length</th><th>Bytesize</th><th>Reverse</th>
  </tr>
  <% for person in @people %>
    <tr>
      <td><%=h person.name %></td>
      <td><%= person.name.length %></td>
      <td><%= person.name.bytesize %></td>
      <td><%=h person.name.reverse %></td>
    </tr>
  <% end %>
</table>
<% form_for :person do |form| %>
  New name: <%= form.text_field :name, value:"" %>
  <%= submit_tag "Add" %>
<% end %>

と逃げた。

きっともっと賢い方法があるに違いないけど今の私にはこれが限界。

|

« [日記] 気分悪い | トップページ | [Ruby] 更に Rails 3e の続き »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [Ruby] Rails 3e の続き:

« [日記] 気分悪い | トップページ | [Ruby] 更に Rails 3e の続き »