2007年10月2日火曜日

rails again

Linux で Ruby on Rails 環境を確保。

サービスの設定に mysqld があるので、起動してみると動いたみたい。

さて、パスワードはなんだ??? 管理ユーザは root なのか???

mysqld は --skip-grant-tables オプションつきで起動すると
権限不要モードで立ち上がる。その状態で mysql mysql で接続して
次のように root のパスワードをクリアできる。

mysql> update user set Password=null where Host='localhost' and User='root';

どうやら RedHat についてくる mysql はこの状態になっている。
(したがって上記は不要)

使える状態にするため root にパスワードを設定する。

# mysqladmin --user=root password <newpass>

なければデータベースを作る

mysql > create table test;

アプリケーション用のユーザーを作る
mysql > grant all privileges on test.* to test@localhost identified by '...';

一応、作成したユーザーでローカルアクセスできるかを確認。
$ mysql -u test -p test
Password:
mysql> show tables;

Rails のインスタンスを作成
$ rails test1

当面は development 部分だけでよいが database 設定を行う(user, password, etc)
$ vi config/database.yml

ちなみに local 接続のソケットはデフォルトが /tmp/mysql.sock になっているようなので
sock: /var/lib/mysql/mysql.sock の一行を入れて適切に変更。このパスは ps -ef | grep mysql
で見つけた。

まずはモデルの作成。

$ ruby script/generate model Book
...
create db/migrate/001_create_books.rb

db/migrate/001_create_books.rb を編集してフィールドを定義
create_table の do block 内にカラムを名前、型で定義。
これで sql を打たなくてもテーブルが作れる。

class CreateBooks < ActiveRecord::Migration
def self.up
create_table :books do |t|
t.column :isbn, :string
t.column :name, :string
t.column :author, :string
t.column :manufacturer, :string
t.column :release_on, :date
end
end

def self.down
drop_table :books
end
end



$ rake migrate
// 実はここで socket がおかしいことに気づいた。

$ rake migrate
== CreateBooks: migrating ====...
-- create_table(:books)
-> 0....
== CreateBooks: migrate (0....s) ===

The rake task migrate has been deprecated, please use the replacement
version db:migrate

メッセージは db:migrate を今後は使いなさいとのこと。

ここで rake と打つとテストをしてくれるらしいが socket のエラーで失敗する。
test 以下のファイルを眺めていると、結局 config の下のファイルに行き着く。
database.yml には test セクションがあり、そこはデフォルトのままだったので
db name, user, pass, socket をなおす。このあとは rake は動作するようになった。

あとは scaffold を Book に対して行えばとりあえず CRUD はできるようになる。

$ ruby script/generate scaffold Book

$ ruby script/server

validation の例:

$ vi app/models/book.rb

class Book < ActiveRecord::Base
protected
def validate
errors.add('isbn', 'format error') unless isbn =~ /\A[0-9X]+\z/
end
end


DB 抜きで簡単なアプリを作りたければ

$ ruby script/generate controller foo
とすると次のファイルができる。
app/views/foo
app/controllers/foo_controller.rb
test/functional/foo_controller_test.rb
app/helpers/foo_helper.rb

このまま foo にアクセスしても Unknown action と出るだけ。
FooController もからだし、view も空っぽだ。

$ vi app/views/foo/index.rhtml

<html>
<head>
<title>Foo</title>
</head>
<body>
<h2>Foo page</h2>
This is the index page for Foo
</body>
</html>


これでも悪くはないがスタイルの適用を考えれば

app/views/layouts 以下に view の名前で rhtml を作り、app/views/<controller>/*.rhtml
は body の中身だけにすると良い。

$ vi app/views/layouts/foo.rhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Foo: <%= controller.action_name %></title>
<%= stylesheet_link_tag 'scaffold' %>
</head>
<body>

<p style="color: green"><%= flash[:notice] %></p>

<%= yield %>

</body>
</html>



$ vi app/views/foo/index.rhtml

<h2>Foo page</h2>
This is the index page for Foo

0 件のコメント: