2007年10月15日月曜日

スケジューラー 明日はLog in

先週の『Parameterの"id"が"update"になる謎。』はやはり単純なミス
<%= start_form_tag({:action => 'update', :id => @schedule}, :multipart => true) %>
引数で :id => @schedule の指定を忘れていました。

さて、次のエラーは。


NameError in SchedulesController#create
uninitialized constant FILE_PATH

/1.8/gems/activesupport-1.4.3/lib/active_support/dependencies.rb:266:in `load_missing_constant'
/1.8/gems/activesupport-1.4.3/lib/active_support/dependencies.rb:452:in `const_missing'
/1.8/gems/activesupport-1.4.3/lib/active_support/dependencies.rb:464:in `const_missing'




const_missing
>定義されていない定数を参照したときに Ruby がこのメソッドを呼びます。
>参照した定数名の Symbol が引数に渡されます。
>デフォルトではこのメソッドは例外 NameError を発生させます。

こちらもケアレスミス。複数名の定数を呼び出すところを単数名で呼んでいた。
ボンミスは良くしますが、今日はちょっと多すぎて自分でも嫌になるなぁ。
風邪のせいとは言えませんが(言ってるw) ぼ〜っとしすぎです。

その後もケアレ・スミス氏と格闘して、「ログイン機能」の追加までたどり着きました。
教本ではLoginGeneratorを使っているのですが、もう古く、
現在 認証系を作る場合は『Acts as Authenticated』を使用するとのことで、
とりあえずPluginはインストールしておいたので・・・
明日は Acts as Authenticated を調べながら自分でやってみようと思います。


□明日のための参考サイト

[本家] Acts as Authenticated

Ruby on Rails: ログイン機能を作る (acts as authenticated 編)


Acts as Authenticatedまとめ


Acts as Authenticated plugin を少しだけセキュアにする

あとで読むRailsのススメ acts_as_authenticated

2007年10月12日金曜日

スケジューラー 続き

教本を進めていくと、月間表示を作成したので
「scaffoldで生成されたlist.rhtmを削除する」と言う項目に従って
list.rhtmlを消すと、エントリを削除できるリンクが無くなってしまった。
教本では後々付け加えるのかもしれないけれど、ちょっと挑戦してみようと思って作業を始める。

まずはedit.rhtmlに


<% form_tag :action => 'destroy', :id => @schedule do %>
<%= submit_tag '削 除' %>
<% end %>



としてみると。簡単に削除ができた。
「削除しますか?」の確認画面が欲しいと思い:confirmを使うためlink_toにして
(最初はform_tagに入れようとしていたけど、うまくいかなかった)



<%= link_to("Destroy",{ :action => "destroy", :id => @schedule }, :confirm => "Are you sure you want to delete this entry?", :post => true %>



と追加してみる。ヨシ、できた。

「Are you sure you want to delete this entry?」にタイトルを入れたくなった。
:confirm => "『 タイトル:#{@schedule.title} 』のエントリを削除しますか?"
でOKだった。



private
def set_file_name
@file = params[:schedule][:file_name]
params[:schedule][:file_name] = @file.original_filename
end




の部分でoriginal_filenameが見付からないというエラーが出たが、
start_form_tagの書き方が教本の頃より変わったらしい。

<%= start_form_tag('create', :multipart => true) %>
と書き直してOK。

次はなぜか
Parameterの"id"が"update"になる謎。


ActiveRecord::RecordNotFound in SchedulesController#edit
Couldn't find Schedule with ID=update

workspace/scheduler/app/controllers/schedules_controller.rb:80:in `find_schedule'


で止まっているし、idに"update"が入るというのはスクリプトの打ち間違えかな
週明けに格闘してみようと思います。



□ Javaから見たRuby on Rails

2007年10月11日木曜日

db:migrate

文字化けはとりあえずDBの作り直しが良いだろうと思ったので作りなおしてみると
db:migrate実行時に



/ruby/gems/1.8/gems/activerecord/lib/active_record/vendor/mysql.rb:523:in `read'
rake aborted!


42000だけど、以前のエラーとはちょっと違うみたい。

>'scheduler_development' なんてデータベースは知りません.
って。知らないだろう。
だって、db:migrateで作ってくれるんじゃないの!?
ということで、ググり

Unknown database bug in Chapter 2 1

>Creating the database is perhaps the easiest way to go.

そうですか。やはり。なんだか腑に落ちないけど。
MySQLでcreateして、問題なくdb:migrateできました。
そして、昨日悩まされていたDBの文字化けについても完治です!

----- db:migrate についての理解不足でした。
データベースを先に作っておかないと、db:migrateもできないのですね。
はい。 


CalendarHelperを使って、なんとかカレンダー表示までたどり着きました。
途中、『 app/controllers/schedules_controller.rb 』に
月を表示させる為のメソッド"month"を作る際に
何も考えず一番最後に追加してしまい、なかなか表示ができませんでしたが、
カレンダー表示をする際にどこまでメソッドを呼び出しているのか
今いち分からないので、とりあえず頭に追加することで解決。

・・・index,list,show,new,creat,edit,updateにmonthを追加するのに
頭もケツもあまり関係ないように思えるが、どこが作用しているのかな??

CSSも設置して、とりあえず形になってきたので
やっと面白くなってきました!!

2007年10月10日水曜日

テーブルが作れるようになった・・・先週からの続き。

MySQLのデータベース権限を指定してあげることでrake db:migrateにて
テーブルが作れるようになった・・・先週からの続き。
スケジューラーのチュートリアルを完成させようと思います。

が、scaffoldでMVCを構築してもらい、「 $ rake 」でテストをしたら
出ました エラー ・・・ 涙




$ rake
(in /home/b-tech01/scheduler)
/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb" "test/unit/schedule_test.rb"
Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader
Started
.
Finished in 0.051288 seconds.

1 tests, 1 assertions, 0 failures, 0 errors
/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb" "test/functional/schedules_controller_test.rb"
Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader
Started
EEEEEEEE
Finished in 0.066953 seconds.

1) Error:
test_create(SchedulesControllerTest):
StandardError: No fixture with name 'first' found for table 'schedules'
/home/b-tech01/scheduler/config/../vendor/rails/activerecord/lib/active_record/fixtures.rb:489:in `schedules'
./test/functional/schedules_controller_test.rb:15:in `setup_without_fixtures'
/home/b-tech01/scheduler/config/../vendor/rails/activerecord/lib/active_record/fixtures.rb:562:in `setup'

−−−− 略 −−−− 同じエラーが8つ −−−−

8 tests, 0 assertions, 0 failures, 8 errors
/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb"
rake aborted!
Test failures




エラーで該当している箇所を見ても、もちろん追いきれなかったので、
『StandardError: No fixture with name 'first'』をググってみた。

Railsのテストが通らない場合


上記URLの " その一 " を実行したら 即、解決! 

> scaffoldを利用した場合、test/fixturesフォルダにfixtureされるymlファイルが生成されます。
> が、なぜかこのファイル内に :firstがうめこまれていないのです。それなのにテストコードのほうは
>
> @first_id = hogehoges(:first).id
>
> で、:firstを探しにいっているので見つからずにエラーになるわけです。不思議ですねぇ

本当に、不思議ですねぇ。
無事表示ができるようになったところで教本の通り、
『一覧表示画面のカスタマイズ』をしてみます。

まず最初のエラーは、簡単なsyntax error
schedules_controller.rbに追記する際に「 , 」を忘れていた。

そして次。
テスト用のデータベースにデータを入れるため/test/fixtures/schedules.ymlに




schedule1:
id: 1 
 datetime: 2007-10-10 12:00
 title: 勉強1
 content: 今日も勉強1
schedule2:
 id: 2
 datetime: 2007-10-11 12:00
 title: 勉強2
 content: 今日も勉強2




と記述するものの、やはりエラーーーー

Fixture::FormatError: ../test/fixtures/schedules.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed.

ArgumentError: syntax error on line 3, col 10: ` datetime: 2007-11-11 12:43:00'

tabは使ってないから大丈夫。・・・と思っていたら、
記述した「 id: 1 」の前にスペースを入れ忘れていた・・・




schedule1:
id: 1 ←←← スペースが入ってない!
 datetime: 2007-10-10 12:00
 title: 勉強1
 content: 今日も勉強1




このケアレスミス、一人だったらほぼ気づけないと思う(汗


そして、現在MySQLの日本語文字化けと格闘中。

● [MySQL] 文字化け問題を本気で直す

を参考にしてみるが、現在もまだ文字化け「????」中。
SQLite3にして先に進んだ方が良いかなぁ・・・とは思いつつも
MySQLでやってみてエラーをたくさん経験して、今のうちに
自分が弱いところなどを知るのも良いかと思ってます。

でも、明日で最後にするつもりです・・・
さきほどまでコマンドプロンプトで作っていたプロジェクトを
Aptanaにインポートしてやっていて、rakeフォルダの中にrakeフォルダ・・・
と意味の分からないことになっていたのが気になっていたので、
Aptanaで最初から同じところまで作ってrakeでテストしました。

・・・が、やはり文字化けしてました。

今日はここまでで、明日頑張ります。
でも、Aptanaの使いかたが分かりつつあるので
無駄ではない!ハズ・・・

2007年10月4日木曜日

No such file or directory - /tmp/mysql.sockについて

ちょっと視点を変えて下記を試してみましたが

・/var/run/mysqld/mysqld.sock のリンクを作成して mysql.sock とリンク名を変更
・RoRで作りかけアプリの中 /scheduler/tmp に放りこんでみる
・/scheduler/config/database.ymlに昨日追加した
「socket: /var/run/mysqld/mysqld.sock」の一文を削除
・$ rake db:migrate を実行してみる。

→ やっぱりダメ!

database.ymlをもう一度見てみる。
コメントには「MySQLのバージョンは4.0と5.0がお勧め」って書いてある。
バージョンは 5.0.38 だから問題なさそう。

database.ymlの socket: 指示を消すと rake はどこから
「/tmp/mysql.sock」だと命令されているのか?


ググってみると
☆ MySQLのソケットの位置はどうやって指定する?

> 1. 引数
> 2. 環境変数 MYSQL_UNIX_PORT
> 3. デフォルト値 /tmp/mysql.sock
> の順でソケットの位置を見ていることがわかった。

だから、やっぱり、scheduler/config/database.ymlに
「socket: /var/run/mysqld/mysqld.sock」って追加すればいいのでは??
ううう。

自分的 FAQ (よくある質問とその回答)
今までやっていたことと同じような感じですが、

>4.WEBrick を再起動

これが気になります。

□WEBrick 起動コマンド
$ ruby ./script/server

http://localhost:3000/確認。
問題なく立ち上がってます。

もう一度



$ rake db:migrate
(in /home/b-tech01/scheduler)
rake aborted!
#42000 Access denied for user 'rails'@'localhost' to database 'scheduler_development'




あー やっとエラーの内容が変わりました!
たぶん、socketは通った(?)
次はMySQLのエラーが〜

MySQLの「#42000Access denied for user ''@'localhost' to database 'sample'」というエラー


>「grant」文で、作ったデータベースで、ユーザー「recipe3」に
>アクセス権減を与える訳ですが、僕はここの「recipe3@localhost;」という
>箇所をチュートリアルのままやっていたので「recipe@localhost;」としたままでした。
との一文・・・で、どう解決されたのだろう・・・

私もチュートリアルの言うままdatabase.ymlを

adapter: mysql
database: scheduler_development
username: rails
password:
host: localhost
encoding: utf8
socket: /var/run/mysqld/mysqld.sock

としたのですが、「'rails'@'localhost'」でエラーが出ているということは
アクセス権の問題?まだテーブル作ってませんが・・・

RubyOnRails を使ってみる 【第 2 回】 (続・RubyOnRails を使ってみる)
データベースの設定

↑ここに答えがありました!!!!

rails@localhost がscheduler_developmentとscheduler_testを
扱えるように下記Queryを実行



mysql> grant all on scheduler_development.* to rails@localhost;
Query OK, 0 rows affected (0.04 sec)

mysql> grant all on scheduler_test.* to rails@localhost;
Query OK, 0 rows affected (0.00 sec)


WEBrickをおまじないのように再起動


$ rake db:migrate
(in /home/b-tech01/scheduler)
== CreateSchedulers: migrating ================================================
-- create_table(:schedules)
-> 0.0647s
== CreateSchedulers: migrated (0.0651s) =======================================



mysql> show tables;
+---------------------------------+
| Tables_in_scheduler_development |
+---------------------------------+
| schedules |
| schema_info |
+---------------------------------+
2 rows in set (0.00 sec)



できたーーーーーーーーー!!

高級?なMySQLではちゃんとデータベースごとにユーザ設定をしてあげなければ
ならないということでした。
はぁ〜〜長かった・・・

Install Aptana to ubuntu --- 続き

AptanaでRadRailsが表示されない現象について、
情報をいただきました。
お恥ずかしいことに、Javaのバージョン確認を見逃していました。

>原因:Javaのバージョンが1.4のまま
>
> * 参考
> o Aptana Forums :: View topic - FAQ - Please read first
> o http://www.aptana.com/forums/viewtopic.php?t=2102
>
>対応:Javaの5.0(1.5)をインストール 

まずはバージョンを確認。

-------------------------------------------
-------------------------------------------

$ java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 (Ubuntu 4.1.2-0ubuntu5)

-------------------------------------------
-------------------------------------------

1.4.2でした!なるほど・・・

$ sudo aptitude install sun-java5-jdk
インストール終了後

> cd /usr/bin
> sudo mv java java_1.4
> sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/java java

教えられた通りにやってみると、
java version "1.5.0_11"
になりました!

以前にRubyもRakeも入れたハズ・・・確認してみると

cd /usr/share/doc/r
radeontool/ readahead/ rss-glx/
rails/ readline-common/ rsync/
rake/ reiserfsprogs/ ruby/
rdesktop/ restricted-manager/ ruby1.8/
rdoc/ rhythmbox/
rdoc1.8/ rpm/

入っているので、Aptanaを起動してみると・・・
Radrailsが入りましたーー!

Javaバージョンなんて、最初に確認しないとだめですよね・・・

AptanaにRadRailsが入ってくれたので、
昨日プロンプトで作りかけていたschedulerプロジェクトをインポートしてみました。

ちょっと気になる感じではありましたが、
インポートも完了。
これから教本見つつAptanaで開発していこうと思います。

その前に、昨日のmigrateのNo such file or directory - /tmp/mysql.sockってとこの問題を
解決しなければ・・・・

2007年10月3日水曜日

RoR チュートリアル

結局、とにかくなにかアプリが作りたい!と思い、
『はじめよう Ruby on Rails』を見ながらコマンドプロンプトで
スケジューラーを作成し始める!! 16時すぎから・・・ (>_<) 本の言う通りに設定を済ませ、データベースも作り、 サクサクサクサク進んで喜んでいたら、「5-1 データベースの設計」で rake を使ってテーブルを作ろうとしたら・・・・出ましたエラー

---------------------------------------

$ rake db:migrate
(in /home/b-tech01/scheduler)
rake aborted!
No such file or directory - /tmp/mysql.sock

---------------------------------------

はい。実際 /tmp/ の中身は空っぽでした。

が、ググったらすぐにみつかりました。

/tmp/mysql.sockが見つからないって言われた

調べてみると


---------------------------------------

sudo mysqladmin version
mysqladmin Ver 8.41 Distrib 5.0.38, for pc-linux-gnu on i486
Copyright (C) 2000-2006 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version 5.0.38-Ubuntu_0ubuntu1-log
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 4 hours 44 min 23 sec

---------------------------------------

config/database.ymlに socket: /var/run/mysqld/mysqld.sock と書いてみる。


・・・・

---------------------------------------

$ rake db:migrate
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)
/usr/lib/ruby/1.8/rake.rb:1822:in `load_rakefile'
(See full trace by running task with --trace)

---------------------------------------

だめじゃ〜ん・・・

ついでに、 /var/lib/mysql/mysql.sock も試してみるがダメでした。
今日はここで時間がきてしまいました。
明日、引き続き頑張ってみます。
うううう・・・・