ruby on rails 初歩の初歩でひっかかったこと2

えー前回の続きでわからなかったことについて@senggonghaza先生にコメントいただきましたので実践してみます。


前回の疑問

・sudo mysqladmin create rails_test_development 実行したrails_test_developmentデータベースはどこにあるのか

先生の回答そのままコピペ。

mysqladminで作成されたデータベースはRootユーザしか参照できないのです。
なので、データベースをみるにはMysqlへのログインは
「mysql -u root 」パスワードが設定されていれば
「mysql -u root -p」でログインしてから
「show databases;」すると作成されたデータベースがみえますよ

う〜ん。ためになった。こちらの疑問は解消しました。

・modelは作ったけどほかはどう作ればいいのか
⇒最後の質問にて解消されるのでとりあえず無視。


ruby-debug19のインストールもつまづく
⇒これはデバッグ用らしいのでまあいいや。

・routeも書く必要ありそう?
⇒こちらも最後の質問にて解消するので読み進めてください。

booksコントローラの生成

・とにかくhttp://localhost:3000/booksで表示するためにどうすればいいの!
⇒こちらが最後の質問。先生の回答に添って進めていきます。

http://localhost:3000/books 
このURLからみるとbooksはコントローラなので

1 . まずbooksコントローラを作成する必要があります。
コマンド:「 rails generate controller books 」

2 . http://localhost:3000/booksを表示したいなら
booksというコントローラにアクションなければ実行できません。 

http://localhost:3000/books = http://localhost:3000/books/index同じなので
デフォルトとして実行されるアクションはindexというアクションのことです。

ですのでbooksというコントローラの中に

def index
   @rails_test = ”hello rails ”
end

を追加してください。 

実行してみた。
1にて rails generate controller books でapp\controllers\books_controller.rbが生成される。
2にて生成されたファイルapp\controllers\books_controller.rbに

def index
   @rails_test = ”hello rails ”
end

を追加。ここまで順調。


views内にindex.html.erb作成

次は>|ruby|
3. その後は index.html.erbというファイルを作成してください。
このテンプレートファイルindex.html.erbの中にはなんでもいいですけど
参考して

<html>
<title>rails test</title>
<body>
<%= @rails_test %>
</body>

</html>

まだhttp://localhost:3000/booksを見るとエラーが出る。
booksできちんとコントローラbooks_controllerを呼び出すよう次で設定する。

config\routes.rbの# match ':controller(/:action(/:id(.:format)))'

その時にroutes.rbファイルの最後の行

# match ':controller(/:action(/:id(.:format)))'
ところをコメントをハズしてみてから実行してみてください。
この行は何を意味するかというと全てのコントローラに
中にアクションが存在すればそのアクションを呼び出せる
というルーティングみたいですよ。

config/routes.rbの該当箇所をコメントアウト

サーバーを起動して

rails s

ブラウザにhttp://localhost:3000/books

表示された!

ちなみにviews/index.html.erbの中身はこんな風にしてます。

<html>
<title>
rails test</title>
<body style="color:red">
<%= @rails_test %>
f
<p>あああ</p>
</body>
</html>

モデルに対応するマイグレーションファイルの中身を入れる

モデルを作ったらそのモデルに対するマイグレーションファイルの中身をいれないと。。

モデル = テーブル ということなので。

テーブルの中にカラムとデータがないとViewに表示ができないのでマイグレーションファイルを作ります。

\db\migrateの中に20111107111111_create_books.rbとでも名づけて以下を保存。

class CreateBooks < ActiveRecord::Migration
def change
create_table :books do |t|
t.string :name
t.string :title

t.timestamps
end
end
end

で、作ったデータベースを反映させるためにmigrateを実行。

rake db:migrate

mysqlで見るとできてます。やったあ。

mysql> show columns from books;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
| title      | varchar(255) | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)


モデルbookのデータ内容をビューで表示したい

\app\controller\books_controller.rbに@books1 = Book.find(1)を追加

class BooksController < ApplicationController

def index 
@books1 = Book.find(1)
#@rails_test ="hello world"
end
 
end

app\views\books\index.html.erbの中には以下を追加する。<%= @book1.title %><%= @book1.name %>

<html>
<title>
rails test</title>
<body style="color:red">
<%= @rails_test %>
f
<p>あああ</p>
<%= @book1.title %>
<%= @book1.name %>

</body>
</html>

で、booksには一つもレコードがないので追加する。

mysql> insert into books(id,name,title) values(1,'本の名前','本のタイトル');

で、http://localhost:3000/booksで見てみる。

エラー発生。

undefined method `title' for nil:NilClass

・・・。
最後の最後でエラー。調べてみたけどわからん。う〜ん。

と思ったら

books_controller.rbが間違っていた。@books1じゃなくて@book1じゃないか!
下記に修正。

class BooksController < ApplicationController

def index 
@book1 = Book.find(1)
#@rails_test ="hello world"
end
 
end

動いた!



結局次の課題

・日本語文字化けとる。

mysqlを日本語対応させなくちゃ。

・あと、railsでデータをCRUDのUとかDとかCとかもできなくちゃ。

まだまだ課題が多すぎるぜ!