写経 (10分で作るRailsアプリ)

最新LLフレームワークエクスプローラ (長) より。
# 写経云々以前に環境設定なナニが微妙かも。

DB の準備

とりあえず DB 作成してみた。親側です (chroot 環境では mysql-server を install してませんので)。

# mysql -u root
mysql> create database bookmark default character set utf8 ;
Query OK, 1 row affected (1.07 sec)

mysql> grant all privileges on bookmark.* to bmuser@192.168.0.1 identified by 'bmuser' ;
Query OK, 0 rows affected (0.91 sec)

mysql> \q
Bye

IP は適当です。(こら
# てか、@ 以降のホスト識別情報ですが、クライアント側の情報なんだろな。
# chroot だと一緒なのでなんか微妙。

で、接続試験。

# mysql -u bmuser bookmark -h 192.168.0.1 -p
Enter password: 
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.3.2' (111)
#

当たり前のように接続失敗。とりあえず ping の返事は帰ってくるんですが、ハマるならココだろうなナニを的確に突いてくるあたりはさすがですな。(何

chroot 側から接続できんな、と思って netstat 見てみるとこんななってるし。

# netstat -n --tcp --all|grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
#

localhost しかリスンしてねぇし。これってドコに設定情報あるんだろな、と。
で、色々調べてみると、mysql てきには以下らしい。

# grep 'bind-add' /etc/mysql/my.cnf
bind-address            = 127.0.0.1
#

ざくっとしか調べてないのでアレなんですが、コメントアウトすればとりあえず動く、との事。きちんとしたヤリ方はあるはずなので、今回はざくっと済ませよう。以下が参考コンテンツです。

で、試験したトコ、接続できますた。

(chroot 側)
# mysql  -u bmuser bookmark -h 192.168.0.1 -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8 to server version: 5.0.20-Debian_1-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> \q
Bye
#

解決方法が微妙スギだが、とりあえずスルー。端末ベースで接続できたんで写経を。とりあえず、$RAIS_ROOT/config/database.yml の development なナニを以下に修正。

development:
  adapter: mysql
  database: bookmark
  username: bmuser
  password: bmuser
  host: 192.168.0.1

サーバ側にてテーブルも定義。

# mysql -u root
mysql> connect bookmark
Connection id:    10
Current database: bookmark

mysql> create table items ( 
    -> id integer auto_increment, 
    -> url varchar(255), 
    -> title varchar(255), 
    -> description text, 
    -> primary key (id) 
    -> );
Query OK, 0 rows affected (1.29 sec)

mysql> \q
Bye
#

なんか微妙だが (写経な結果がケられたので primary key 句を追加) このまま進めてみます。

コーディング

このサンプルでは scaffold な generator を使っていない模様。model と controller を個別に作成しておりますな。がしかし、面倒なので scaffold を generate。

$ ruby script/generate scaffold Item Item
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/item
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/item.rb
      create    test/unit/item_test.rb
      create    test/fixtures/items.yml
      create  app/views/item/_form.rhtml
      create  app/views/item/list.rhtml
      create  app/views/item/show.rhtml
      create  app/views/item/new.rhtml
      create  app/views/item/edit.rhtml
      create  app/controllers/item_controller.rb
      create  test/functional/item_controller_test.rb
      create  app/helpers/item_helper.rb
      create  app/views/layouts/item.rhtml
      create  public/stylesheets/scaffold.css
$

動作確認は略。テキストでは list アクションのコードについての解説あり。ほとんどのメソッド(アクション) が一行。以下が list アクション。

  def list
    @item_pages, @items = paginate :items, :per_page => 10
  end

item_pages と items という名前のインスタンス変数に paginate というメソッドの戻りを設定している訳ですな(あら? このメソッドはもしかすると二値を返却しているのかなぁ)。controller クラスのインスタンス変数は view で取り出せたはずなので (うろ覚え) app/views/item/list.rhtml でナントヤラ、な処理が記述されているはずである、と。
ちなみにテキストでは、この paginate メソッドの引数についての簡易な解説あり。paginate メソッドの詳細な説明は以下のサイト、との事。
Module:ActionController::Pagination

日本語化

忘れていた。UTF-8 対応をしておかねば、という事で

  • mule-ucs パケジの導入
  • config/environment.rb の修正

config/environment.rb の先頭に以下の一行を追加

$KCODE = 'u'
  • app/controllers/application.rb の修正

app/controllers/application.rb の ApplicationController クラスの定義部分を以下のように修正。

class ApplicationController < ActionController::Base
  before_filter :set_charset

  protected
  def set_charset
    @headers["Content-Type"] = "text/html; charset=utf-8"
  end
end

10 分で、と言いつつ集中力が無いタメ {暑い, がきが五月蝿い, 遊びに行きたい}、なかなか先に進まない。