Ruby on Rails

2009年05月18日

Ruby on Rails:サブドメインでredirect_toを用いる場合の注意点

 RoRのアプリをサブドメインでデプロイしようとすると、
 開発環境のNetBeansを用いたデバックはドキュメントルート下で起動して、リリース環境ではサブドメイン下でアプリが動くことになりパスの指定でずれることが多く苦労します。

 (NetBeansでサブドメイン下に配置してデバックする方法をご存知の方教えてください)

 View部分のlink_toやimage_tagはちゃんとサブドメインを踏まえたパスを生成してくれるのだが、Controllerでredirect_toを用いた場合にサブドメインが考慮されなかった。

 解決は(public/404.htmlに飛ばす場合)

 
redirect_to request.relative_url_root + "/404.html"


 と記述することで一応の対応はできたけれど、これだとリダイレクトする場所毎にこのような記述が必要になる。
 設定ファイルとかで対応できないものだろうか・・・

Ruby on Rails:to_xmlのマルチバイト処理

 RoRの開発環境&デプロイで色々つまづいてしまいましたが、
 ようやくアプリケーションん開発に移行できそうです。

 とりあえず今までPHPで作っていた色々をRailsに書き直しながらコツを掴んで行きたいと思います。

 自分の場合、Flashと絡めたコンテンツ作成が多いので、データ出力の際にto_xmlやto_jsonというXML形式やJSON形式に変換してくれるメソッドがあるのは非常にありがたい。

 AcctiveSupport万歳!!

 と思っていたら、to_xmlの出力で日本語が数値参照に変換されてしまっている・・・。
 Flash側で数値参照を扱うのは面倒なのでRails側で対応しようと調べてみると色々対応している方がおりました。

 印刷屋のdeveloper日記
 ActiveRecord#to_xmlの日本語対応版(?)を作る

 くふんを狙え
 Rubyで数値文字参照をUTF-8にする

 というわけでxmlは解決したけど、to_jsonもなにやら変換されてるなぁ・・・。

2009年05月17日

Ruby on Rails:Passengerで躓く(というかぐち)

 最近、FastCGIからPassengerに(ようやく)移行しつつあるのですが、
 開発環境構築で1時間ほど躓いて起きれなかった。

 症状としては

 railsアプリ作成して、database.ymlやパーミッションの設定を済ませた後に、

 public/index.htmlの

 About your application’s environment

 をクリックすると、

 
The page you were looking for doesn't exist.

You may have mistyped the address or the page may have moved.


 と表示されてしまうというもの。
 たぶん、Passenger経験者やRailsに慣れた方ならピンと来るんだろうなぁと思います。
 
 普段ならここに色々な開発設定が表示されるのですが、なぜか500エラー時の文言が表示される。
 ミスタイプかページが削除されたんじゃね? とか言われてしまいました。

 apacheのアクセスログでは500(そりゃそうか)、エラーログには記載無し。
 railsのログを見ても何も書き込まれない・・・。

 おかしいおかしいと色々やっていたら、ふとした拍子に
 {railsインストールディレクトリ}/log/production.log
 にログが書き込まれた。

 ・・・・production.log???

 ようするにこいつはproductモードで稼動しているわけだ。
 今更だけど、productモードはリリース時の稼動を想定しており、developmentモードよりエラー情報等が制限されている。
 もちろん、環境情報なんて出力するはずが無い・・・。

 というわけでhttpd.confに

 
RailsEnv development


 を追加してApache再起動で無事解決。

 確かにPassengerがデフォルトでproductionモードで動くと知らなかった自分の知識不足なんだけど、エラー文言もどうかなと。

2009年05月13日

Ruby on Railsの開発環境をしっかり構築する その3

 ほぼデフォルトのCentOSからRails起動のための色々(+α)を導入するメモ。

 構成は

 CentOS 5.3
 Ruby 1.8
 Rails 2.1.1
 Apache 2.2.3


 以上。開発環境構築なので、色々とゆるい面(そのせいで落とし穴にはまった)がありますがご了承ください。

1.Apacheインストール

#yum -y install httpd
     
(自動起動)
#chkconfig --add httpd
#chkconfig httpd on


2.ついでにPHPもインストール(不要)

#yum -y install php php-mbstring


3.Rubyインストール

#yum -y install ruby
#yum -y install ruby-devel
#yum install gcc* // (gccもインストール)


4.MySQLインストール

#yum install mysql-server
#/etc/rc.d/init.d/mysqld start
#chkconfig mysqld on

  

5.Ruby Gemインストール

コマンドラインで、

#vi /etc/yum.repos.d/dlutter.repo


上記ファイルに以下のように記述

[dlutter]
name=Unsupported RHEL5 packages (dlutter)
baseurl=http://people.redhat.com/dlutter/yum/rhel/5/$basearch/
enabled=0
gpgcheck=0


いよいよGemsのインストール。

#yum --enablerepo=dlutter -y install rubygems.noarch


参考サイト

 
6.Railsインストール

#gem install rails


--include-dependencies つけたほうがいいかも

7.フィルタリングをオフ

#chkconfig iptables off


8.passengerをインストール

#gem install passenger


#passenger-install-apache2-module



 色々ないけど、教えてやるよーという親切インストーラー
 教えてくれた結果が以下

Installation instructions for required software

* To install Apache 2 development headers:
Please run yum install httpd-devel as root.

* To install Apache Portable Runtime (APR) development headers:
Please run yum install apr-devel as root.

* To install Apache Portable Runtime Utility (APU) development headers:
Please download it from http://httpd.apache.org/
(APR Utility is an integrated part of Apache.)


 自分の場合、yum install httpd-develでapr-develもインストールされた。

 インストール終了。その後もhttpd.confに追記する箇所や、バーチャル設定の書き方を教えてくれるのでメモ。

The Apache 2 module was successfully installed.

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

LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2
PassengerRuby /usr/bin/ruby

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:

<VirtualHost *:80>
ServerName www.yourhost.com
DocumentRoot /somewhere/public # <-- be sure to point to 'public'!
</VirtualHost>


トラブルシューティング

 ・passengerはrootでは動かないので、かならずrailsのディレクトリ以下の所有ユーザーはroot以外(apacheなど)にしておく

 ・下記のようなエラーがhttpdのエラーログに出ていたら

*** Passenger ERROR (ext/common/ApplicationPoolServer.h:602):
Cannot execute /usr/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/apache2/ApplicationPoolServerExecutable: 許可がありません (13)
[Wed May 13 11:22:46 2009] [notice] SELinux policy enabled; httpd running as context root:system_r:httpd_t:s0
[Wed May 13 11:22:46 2009] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)

 以下のように対応
#setenforce 0


【参考】
Rails開発環境をしっかり構築する その2
Rails開発環境をしっかり構築する その1

2009年05月01日

Ruby on Rails:NetBeansの良さがちょっとわかってきたぞ

 Ruby勉強会のネタ作成のためにRuby on Railsを再入門しています。
 昨日までに開発環境を作成してNetBeans上でscaffold機能をためしてみたので、本日はscaffoldで作成されたコードをいじくり倒してみる。

 CakePHPと比較してみると、コントローラー上の変数がそのままViewで利用できる点が異なっていますね。
 (CakePHPの場合はsetメソッドで明示的に渡す必要がある)

 あと、development(開発)モードだとlogディレクトリの中に色々な情報が書き出されていてこれは便利。
 SQLクエリもあるけど、これを拡張してexplainの結果も残すようなプラグインがあるとさらにすばらしいかも。

 コントローラークラスでのdumpの出し方がわからず、render :textなんかでお茶を濁していましたが、pやputsの中身はサーバーログに出力されているんですね。
 NetBeansの場合コンソールでサーバーログをそのまま見ることができるのでこれも便利。
 PHPの場合はvar_dumpは便利だけど、そのままビューに表示されてしまうので、RoRの動作の方が安心できる。

 PHPのvar_dumpに相当するものが無いなぁと思っていたら、

 
require 'pp'


 することでppメソッドが使えるようになりこれがデバックに便利。
 そもそもNetBeansにはデバッカがあるんで、それを使えという話ではあるのですが、デバッカ起動すると必ずドキュメントルートから始まるのでppとか使うほうが今のところ楽。

 特定のコントローラーからデバック実行する方法ご存知でしたら教えてください。

 と、CakePHPと色々比較していくつもりがCakePHPをかなり忘れている・・・先は長い。

 

2009年04月30日

Ruby on Rails:2系でモデル作成後のscaffoldでmigrateファイルが上書きされる件の対応

 モデル作成後にindexやら色々つけたマイグレーションファイルが、同モデルに対してscaffoldを作成したとたん上書きされてしまった。

 --skip-migration

 でマイグレーションの生成をやめてしまえばよいとわかったのだがNetBeansの生成コマンドからの指定の方法がわからず悩む。

 色々やったあげく、属性ペアの頭に--skip-migrationを書けばよいと判明。

 ・・・属性ペアの最後につけたりはしてたんですが、頭ですか。

 scaffoldを削除する際も--skip-migrationオプションを忘れずに。

 NetBeansで履歴からファイルを復帰できるのが非常に助かりました。

2009年04月27日

Ruby on Railsの開発環境をしっかり構築する その1

 近々北陸でRuby on Railsの勉強会をする予定なのでRailsを開発する環境を再度整えようと思う。

 以前はAptanaを利用していたが、Rails開発している人を見ると、NetBeans利用者が多い模様。
 というわけでNetBeansをさわりはじめてみた。

 使った感じだとDB設定さえすれば簡単にアプリケーションを動作テストすることが可能・・・だけど、Glass Fishというサーバー上での動作で、これをApacheで動かそうとすると急に面倒になるのがRails(自分の経験では)。

 というわけで仮想PCでCentOS、Winのローカル環境にもXAMPPのApacheからRailsを実行できる環境を作成しておこう。

 勉強会の形式次第ではRoRとCakePHPの比較ネタをやりたいのでPHPも動くようにしておく。

 最近Flashばかりだったので、自宅のPCにしっかりしたサーバーサイド開発の環境ができていないことを痛感。
 

2009年03月01日

Redmineで通知メールが送信できない場合

 Redmineの修正で、動作サーバーをWebrickからApacheに変更したところなぜかメールが送信できなくなっていました。
 リマインダメールなんで、いいかぁと思っていましたが、

 パスワードの変更にメールを利用する必要がある

 という重大というか、どうして見落としてたんだ、という致命的不具合があることがはっかく(ご迷惑をおかけしました)。

 というわけで、なぜRedmineからメールが送れないかを調査。

【smtpがそもそも駄目説】

 はじめてコマンドラインからsendmailを使ってみました。

 
#sendmail hoge@hoge.com


 おっ、応答が無くなった・・・とあせりましたが、その後引き続いてコマンドを入力するんですね。

 
test mail send
 .


 ピリオドでコマンド終了。
 受信を確認できたので、一応メーラーは動いているよう。

【管理タグからテスト送信できることが判明】

 Redmineはちゃんと管理ページから「テストメールを送信する」ことができるんですね。

 Redmineの管理者権限(プロジェクト単位の権限ではない)でログイン、上部メニューの「管理」をクリック「設定」→「メール通知」と進むと、右したに「テストメールを送信」というリンクがありますのでクリック。

 hostname nor servname provided, or not known

 ホストの名前が解決できない模様・・・。
 色々設定を変えてみたがこのメッセージが消えない。

 Webrickの場合ちゃんと動作していたので、Webrickをポート指定で立ち上げることに思い立つ。
 すると、こちらでも同様のエラー・・・ありゃ?

 なんで今まで送信できていたのだろうという疑問は残るが、色々設定変更したせいかも知れない・・・。
 現場保存の法則違反でちょいと作戦失敗感が漂ってきましたが、Webrickの場合公開していないURLなので再起動等が手軽に行えるという利点もあります。
 今回はその利点が効を奏して、再起動しないと設定が反映されないことを発見・・・。

 というわけでApacheを再起動、送信できるようになりました。

2009年02月25日

Redmine高速化に成功!!

 遅い遅いと思っていた、自宅PCでのRedmine動作をかなり高速化することに成功しました。

 きっかけはさくらサーバーでRedmineをCGIで動作させた際に、家のPCと同じ位遅かったこと(これは家のやつも改善の余地があるんじゃないか?)と、さくらサーバーでRedmineを構築した際にApacehのログが見れず、エラー時の原因究明が困難と感じたことでした。

 それなら自宅PCのRedmineをチューンしてしまえ、と久しぶりにRoRの設定と向き合った結果、かなり改善されました。

 まずはサーバーをWebrickからApacheに変更。
 これはあまり速度変わらず。

 CGIからFCGIに変更。

 おーっ、ストレス無く動作するようになりました。

 というわけで、さくらサーバーは2週間のお試し期間内でキャンセルさせていただきましたが非常に参考になりました。
 RoRでfastCGIが利用できるようになったら再び利用を考えようかと思います。

2009年02月20日

さくらサーバーレンタルしました

 自宅サーバーでRed5およびRedmineを運用していたのですが、みんなで利用するRedmineのようなツールは信頼性が大事だなぁということで、Ruby on Railsが使えるレンタルサーバーを利用することにしました。

 社内でも利用者がいて、Twitterでも良く耳にしたさくらをチョイス。

 とりあえず2週間無料期間があるんで、その間に色々触ってみたいと思います。

 

Profile

シーラカンス

Recent Comments
QRコード
QRコード
livedoor Readerに登録
RSS
livedoor Blog(ブログ)