Rails

Rails の定数に SVN のリビジョン番号を設定する。

config/environment.rb の末尾に以下を追加した。 SVNVERSION = %x{svnversion #{RAILS_ROOT}}.sub(/^$/,"NA") 最新の状態で起動しているか。 複数のアプリケーションやサーバが、同じリビジョンで動いてるか。 起動時に作業ディレクトリに変更が加えられて…

Rails2.xでログを独自のフォーマットで出力する。

現時点(Rails2.3.2)では、BufferedLoggerのフォーマットは変えられないらしい。 #1307 BufferedLogger should support message formatting. - Ruby on Rails - rails formatterを設定するパッチが出てるけど、まだ取り込まれてない。 loggerで出すログのフォ…

Railsでrenderする時のステータスコードの指定方法。

http://api.rubyonrails.org/classes/ActionController/Base.html render :text => "error", :status => 500 render :text => "error", :status => :internal_server_error statusをシンボルで指定する場合は、lib/action_controller/status_code.rbを参照。…

Railsのバリデーションについて。

バリデーションの階層 ActiveRecord::Validations::ClassMethods の一番上にバリデーション方法の階層について書いてある。高レベルな順に、 validates_presence_of :firstname みたいなやつ。modelのクラスレベルで呼ぶ。 validates_each クラスメソッドの …

ブラウザから複数ファイルアップロード。

ブラウザから複数のファイルを一度にアップロードできるサービスがある。 http://www.picamatic.com/ http://f.hatena.ne.jp/ http://www.betriebsraum.de/FileBrowser/FileBrowser.htm ( http://www.betriebsraum.de/blog/2006/01/15/update-flash-8-file-b…

MySQL + ActiveRecord でシーケンス番号を生成。

MySQLとActiveRecordでsequenceみたいなことをする方法。LAST_INSERT_ID()を使う。ここらへんを参考に。 http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html#function_last-insert-id モデルを生成。 $ ./script/generate model xxx_sequen…

ActionMailerで、メールのヘッダもビューに書けるようにする。

以下はRails 1.2.3の話。2.0でどうなってるかは知らないです。もっと良くなってるかも。概略 From: info@example.com To: <%= @user.email %> Bcc: admin@example.com Subject: <%= @user.name %>さんにお知らせです。 Content-Transfer-Encoding: 7bit <%= …

ActionView::Baseのキャッシュの更新処理が変な気がする

rsyncでRailsのテンプレートを同期した時に、たまに変更が反映されないことがある。ActionView::Baseのテンプレートが更新されたかどうかのチェックは、「ファイルの変更時刻」と「コンパイル時刻」を比較していて、これがマズイんじゃないだろうか……。 @@co…

RailsのTextHelper#textilizeがまともに動かない。

TextHelper#textilize は少なくとも手元の環境(Rails 1.2.6/RedCloth 3.0.4)ではまともに動かないっぽい。以下の手順で確認した。 $ ./script/console >> a = ActionView::Base.new # リストから脱出ができない。 >> a.textilize("abc\n* def\n\n\nghi") => …

ActiveRecordを外す時はActionWebServiceも外す必要がある。

上の記事で、 config.frameworks -= [ :active_record ] と書きましたが、これだとActiveRecordがロードされてしまいます。一緒にActionWebServiceも外す必要がありました。 config.frameworks -= [ :active_record, :action_web_service ] 以下のようにして…

Rails 1.2.x でActiveRecordを使わない方法。

RailsでActiveRecordを使いたくない場合、config/environment.rbに config.frameworks -= [ :active_record ] と書く方法が以前から紹介されていました*1。……が、これは手元の1.2.6でエラーになります。どうやら1.2.1からActiveRecordを外せなくなっていたよ…

render メソッドは、コントローラとビューで動作が違う。

Ruby on Rails の render メソッドは、コントローラとビューで動作が違う。 ActionController::Base#render ActionView::Base#render の2つは動作が異なる。 *.rhtml やヘルパーから呼ばれるのが、ActionView の render。 ActionView の render は、結果の文…

HTTPリクエストヘッダをダンプ

p request.envrequestのクラスはActionController::CgiRequest。ActionController::AbstractRequestを継承。 actionpack-1.13.3/lib/action_controller/cgi_process.rb actionpack-1.13.3/lib/action_controller/request.rb

Poundじゃダメかもしれない。

Apacheが1.xでmod_proxy_balancerが使えないので、Poundを入れてみた。とりあえず Apache mod_proxy → Pound → mongrel_clusterみたいな感じで、mod_proxy_balancerの代替にしてみようと思った。けど、X-FORWARDED-FORが元のアドレスを保持してくれない。カ…

SQLの条件を組み立てるRailsプラグイン Condition Builder 1.1

RailsでSQLの条件を扱う、Condition Builderプラグインが便利です。 最新版(1.1) http://blog.inquirylabs.com/2007/06/28/condition-builder-11/ 説明 http://blog.inquirylabs.com/2007/01/04/condition-builder-10-released/ 以前の記事 http://blog.inqu…

RailsのビューをJavaScript形式でレンダリングする。

<script type="text/javascript" src="/include.js"></script> ↓ document.write('<p>foobar<\/p>');のようにJavaScriptで外部HTMLをインクルードしたい場合。 document.writeをRailsで出力するメソッド。 def render_to_js(opts) str = render_to_string opts str = str.gsub(/[\r\n]/," ") str = str.gsub(/\\/,"\\\\") s</p>…

ActiveRecordのフォームの雛形を手っ取り早く作成する。

<%= form("record_name") %> で@record_nameのフォームを簡単に生成できるというのを知った。 http://api.rubyonrails.org/classes/ActionView/Helpers/ActiveRecordHelper.html でも細かい編集もしたかったので、以下のようにしてみた。 <%= form("record_n…

created_on より created_at を使う。

テーブルにcreated_atというカラムを作っておくと、ActiveRecordが自動的にデータを作成した日時を記録してくれる。Magic Field Name。似たようなのに、以下の4種類がある。 created_at …… 作成日時 created_on …… 作成日 updated_at …… 更新日時 updated_on…

ActiveRecordのfind(id)はnilを返さない。

f = Foo.find(id) return nil if f.nil? みたいなコードを書いてしまいそうになる。これは間違い。find(id)で見つからない場合、例外(ActiveRecord::RecordNotFound)が発生する。正しくは、 f = Foo.find_by_id(id) return nil if f.nil?

HTMLエスケープして改行をbrに変換

application_helper.rbに追加する用。 def hbr(str) str = html_escape(str) str.gsub(/\r\n|\r|\n/, "<br />") end # <%=hbr textarea_value %>

Railsでセッションをオフにする。

ActionWebServiceを使っていたら、クライアント側にクッキーが設定されないせいで、リクエスト毎にセッションファイルが1つずつ増えていた。ので、セッションをオフにする方法を調べた。 http://wiki.rubyonrails.org/rails/pages/HowtoChangeSessionOptions…

Railsのバージョンを上げたらmodels以下のサブディレクトリの扱いが変わっていた。

app/models/abc/model_name.rbというファイルがあった場合、以前は ModelNameだったのが、1.2.3では Abc::ModelNameになってた。こっちのほうが正しい感じだけど、すごく困る。

ActionWebServiceの引数にXML特殊文字を2個続けて渡すとエラーが発生する問題、の続き

http://d.hatena.ne.jp/koseki2/20070316/AwsDoubleCharaEntity の続き。原因がわかった。AWSのバージョンは1.1.6。ActionPackのバージョンは1.12.5。エラーが発生している箇所は、ActionPack内のcgi_methods.rbで定義されている CGIMethods.parse_request_p…

ActionWebService を使うアプリケーションを作成する手順

ActionWebServiceを使う簡単なアプリケーションを作成した。AWSを使うとき毎回参考にしてるのはこのページ。 http://idm.s9.xrea.com/ratio/2006/04/17/000414.html 参考になります。 AWSを使ったウェブサービスの開発手順最初にrailsアプリケーションを生成…

ActionWebServiceで、引数に2個XMLの特殊文字が連続するとエラーになる。

(追記) http://d.hatena.ne.jp/koseki2/20070318/AwsDoubleCharaEntity2 に続きがあります。追記終わり。 下の記事の手順に従って、AWSを使うシンプルなアプリケーションを作成した後、client_controller.rbの、get_infoメソッドを次のように変えてみる。 cl…

text_areaメソッドは :size=>"30x10" のような指定ができない?

text_area_tag がサポートしている :size=>"30x10" のようなサイズ指定が、text_area だとうまく適用されない。 <%= text_area_tag("field_name", "value", :size=>"30x10") %> <%= text_area("obj_name", "method_name", :size=>"30x10") %>↓ <textarea cols="30" id="field_name" name="field_name" rows="10">value</textarea>

Mongrelにシグナルハンドラによるトレース機能を追加する方法。

$ kill -QUIT `cat ./log/mongrel.pid`でトレースをオン・オフできるようにする方法。以下のスクリプトを保存し、-Sオプションでファイルを指定してMongrelを起動します。 # # mongrel_handlers.rb # require 'tracer' @my_tracer_flg = false trap("QUIT") …

Rails + MySQL (+ Mongrel?) でDB接続の通信が無い状態が続くとデッドロックする。

(追記) この問題について、原因はRubyの側にあるのではないかと考えています。特定の条件下でTCPSocket#flushを実行すると、スレッドが停止したまま処理が戻ってこなくなります。以下の投稿で、Railsを使わず再現する方法を説明しました。 http://blade.naga…

Ruby on Railsでクッキーにドメインやパスを指定すると、cookies.deleteで削除できなくなる。

rails 1.1.6 / actionpack-1.12.5 で。 http://dev.rubyonrails.org/ticket/3685 なんだかクッキーが消えないと思ったら、domainを指定していたせいでした。以下のアプリケーションで確認しました。 cook_controller.rb class CookController < ApplicationC…

パスワードをdatabase.ymlの外に追い出す方法

Ruby on RailsでDBのパスワードをdatabase.ymlの外に書く方法。Subversionにパスワードをコミットするのが嫌だったので調べた。database.ymlはERBで処理されるというのを知らなかった。 http://skwp.wordpress.com/2006/08/28/encrypted-db-passwords-for-ra…