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とかもできなくちゃ。
まだまだ課題が多すぎるぜ!