2008年4月21日月曜日

passengerで初めてのRoR(3)

Subversionへの登録

ここにあるのを上からやって終わり。
http://wiki.rubyonrails.com/rails/pages/HowtoUseRailsWithSubversion


次はモデルの作成。ボタン一発!位の気持ちでやったんだけどscaffoldでうまく生成できない

% script/generate scaffold boards id:integer name:string url:string

最初のエラー
undefined local variable or method `new_boards_path' for #

なぜか分からず、コンソールからDBにとりあえずデータを入れてみる。

You have a nil object when you didn't expect it!
The error occurred while evaluating nil.to_sym

またエラー・・・ここで気になったのが、生成されるindex.html.erbの10行目から19行目のfor文

<% for boards in @boards %>

<%=h boards.id %>
<%=h boards.name %>
<%=h boards.url %>
<%= link_to 'Show', boards %>
<%= link_to 'Edit', edit_boards_path(boards) %>
<%= link_to 'Destroy', boards, :confirm => 'Are you sure?', :method => :delete %>

<% end %>

for で生成している boards とlink_toで使ってるboardsがかぶってる。。。エラーもlink_toの最初に出る行だし、、、なんて悩みつつ


で、いろいろ探してこちらのサイトでドンピシャな答えをいただきました。
http://www.smallmake.com/smalltalk/computer/2007/12/rails_the_error_evaluating_nil.html

答えは複数形・・・orz

こう変えて、解決しました。
% script/generate scaffold board id:integer name:string url:string
% rake db:migrate


本当はもっと紆余曲折あったけど、(scaffold の前にgenerate migrateしたり、それを消したりとか)コマンド履歴を見るとそのころは単数形で書いているので、どこでどうまちがったんだか・・・

Rubyの構文がまったくわかっていのが今日の敗因。そのせいであからさまに変数名がかぶってるのに、そういうものなのか?と思って放置してしまったり。

とりあえず、今日、「たのしいRuby」買いました。

2008年4月20日日曜日

passengerで初めてのRoR(2)

原因が分かった。たいした問題ではなかった・・・。

cp /usr/local/src/passenger-1.0.1/bin/passenger-spawn-server /usr/local/lib/ruby/passenger/

上記のように実行ファイルのみをコピーしていたけど、ライブラリ関連も必要な感。

以下のように移動する。
mv /usr/local/src/passenger-1.0.1 /usr/local/lib/ruby/passenger

あわせて、httpd.confも修正。一行目変更なしでもいいけど、一応。

LoadModule passenger_module /usr/local/lib/ruby/passenger/ext/apache2/mod_passenger.so
RailsSpawnServer /usr/local/lib/ruby/passenger/bin/passenger-spawn-server

動いた!

./script/generate controller index
touch ./app/view/index/index.tpl.erb

./config/routes.rbの下のほうに[# map.root :controller => "welcome"]という行があるので、
コメントアウトをはずして、welcopmeをindexに変更。

最後に、[./public/index.html]を削除すると、トップページがindex_contorllerのindexアクションに
変更される。

rm ./public/index.html

次はバージョン管理へ登録

passengerで初めてのRoR(1)

RoRを使ってみたいと思いmod_passengerを入れてみる

とりあえず、gemなんてコマンドはないので、ソースをDLしてコンパイルすることに

http://www.modrails.com/install.html

tar xzvf passenger-1.0.1.tar.gz

./passenger-1.0.1/bin/passenger-install-apache2-module

Checking for required software...

* GNU C++ compiler... found at /usr/bin/g++
* Ruby development headers... found
* OpenSSL support for Ruby... found
* RubyGems... not found
* Rake... not found
* Apache 2... found at /usr/local/sbin/httpd
* Apache 2 development headers... found at /usr/local/sbin/apxs
* Apache Portable Runtime (APR) development headers... found
* fastthread... not found

なんかエラーが出てとまった。gemは必要らしい。

仕方ないので、以下からDL、インストール
http://docs.rubygems.org/

tar xzvf rubygems-1.1.1.tgz
ruby setup.rb

インストール完了。コマンド名はgem18らしい

ついでにnot foundなRakeとfastthreadをインストール。gem大活躍

gem18 install rake --remote
gem18 install fastthread --remote
gem18 install rails

もう一度インストーラーを起動して、Enter何度か押してインストール完了(たぶん)

./passenger-1.0.1/bin/passenger-install-apache2-module

インストール完了メッセージメモ
--------------------------------------------
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

LoadModule passenger_module /usr/local/src/passenger-1.0.1/ext/apache2/mod_passenger.so
RailsSpawnServer /usr/local/src/passenger-1.0.1/bin/passenger-spawn-server
RailsRuby /usr/local/bin/ruby18

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.


--------------------------------------------
Deploying a Ruby on Rails application: an example

Suppose you have a Ruby on Rails application in /somewhere. Add a virtual host
to your Apache configuration file, and set its DocumentRoot to
/somewhere/public, like this:


ServerName www.yourhost.com
DocumentRoot /somewhere/public


And that's it! You may also want to check the Users Guide for security and
optimization tips and other useful information:

/usr/local/src/passenger-1.0.1/doc/Users guide.html

Enjoy Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

srcディレクトリを参照するのも微妙なので、コピー

cp /usr/local/src/passenger-1.0.1/ext/apache2/mod_passenger.so /usr/local/libexec/apache22/
cp /usr/local/src/passenger-1.0.1/bin/passenger-spawn-server /usr/local/lib/ruby/passenger/


httpd.confファイルに以下を追記
LoadModule passenger_module /usr/local/libexec/apache22/mod_passenger.so
RailsSpawnServer /usr/local/lib/ruby/passenger/passenger-spawn-server
RailsRuby /usr/local/bin/ruby18


ServerName xxxx.reirou.jp
DocumentRoot "/path/to/project/public"
RailsEnv "development"
RailsBaseURI /

Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all



これで再起動

サーバーバージョンのところにPhusion_Passenger/1.0.1 って記載が出てきたので、とりあえずの
インストールは完了。のはず

と思って xxx.reirou.jp を開くもエラーが出るのでちょっと悩む。

Passenger error #2
Passenger thinks that the Rails application's "public" directory is "/path/to/project/public", but it doesn't seem to be valid.

結局railsのプロジェクト?を作ってないかららしい、
/path/to で以下のコマンドを入力して一応画面は表示された。

#rails プロジェクト名

と画面は出たけど、[About your application’s environment] をくりっくするとInternalServerError・・・

とりあえず、それはおいておいて、sqlite3を入れておくgem18 install sqlite3-ruby

WEBrick「./script/server」を使って試すと動作するので、問題はPassengerにある模様・・・

眠いのでまた明日。

2008年4月1日火曜日

Zend_Config自体をキャッシュする。

YAMLのキャッシュ はクラスを使い分けないといけないのが面倒だったので、ローダー的なものを作った。
ついでに、Zend_Config_Xml,Zend_Config_Iniもキャッシュできるように。

Rf_Config_Yamlもいじったのでその内容は以下
Zend_Configで YAML を使う


Configローダー的な何かはこちら

今回は、配列をキャッシュするのではなく、クラスそのものをキャッシュするように変更。


ロード時間のテストはしてないのでどのくらい違うのかは不明。

ToDo:ファイルの文法エラーなどの場合の動作は?
ToDo:可能であれば、タイムスタンプの確認でキャッシュファイルを消すように変更。