<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rails 2.0 &#187; Tips</title>
	<atom:link href="http://rails20.jp/category/tips/feed/" rel="self" type="application/rss+xml" />
	<link>http://rails20.jp</link>
	<description>Rails開発のTips、ソフトウェア、ライブラリに関する情報をお届けします。Railsの開発受託も行っています。</description>
	<lastBuildDate>Thu, 08 Oct 2009 04:14:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>File.exists?を使わずに…</title>
		<link>http://rails20.jp/2009/09/dont_use_file_exists/</link>
		<comments>http://rails20.jp/2009/09/dont_use_file_exists/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 22:36:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[開発]]></category>
		<category><![CDATA[37signals]]></category>

		<guid isPermaLink="false">http://rails20.jp/2009/09/dont_use_file_exists/</guid>
		<description><![CDATA[&#60;% if File.exists?(model.path) %&#62;
&#160;&#160; ...
&#60;% end %&#62;
ではなく、
&#60;% if model.file_exists? %&#62;
&#160;&#160;...
&#60;% end %&#62;
というのが37signals流。メリットは、

ビューがすっきりする
結果をキャッシュできる
ユニットテストしやすい
ローカルファイルシステムから別システム（S3とかMogileFSとか）へ移すことも想定
MVCとしてモデルがファイルを参照するなら、それがどこにあるかはモデルだけが把握すべき

といったことが挙げられています。
A design and usability blog: Signal vs. Noise (by 37signals)
　http://37signals.com/svn/posts/1944-dont-do-this-if-fileexistsmodel

]]></description>
			<content:encoded><![CDATA[<p><code>&lt;% if File.exists?(model.path) %&gt;<br />
&nbsp;&nbsp; ...<br />
&lt;% end %&gt;</code></p>
<p>ではなく、</p>
<p><code>&lt;% if model.file_exists? %&gt;<br />
&nbsp;&nbsp;...<br />
&lt;% end %&gt;</code></p>
<p>というのが37signals流。メリットは、</p>
<ul>
<li>ビューがすっきりする</li>
<li>結果をキャッシュできる</li>
<li>ユニットテストしやすい</li>
<li>ローカルファイルシステムから別システム（S3とかMogileFSとか）へ移すことも想定</li>
<li>MVCとしてモデルがファイルを参照するなら、それがどこにあるかはモデルだけが把握すべき</li>
</ul>
<p>といったことが挙げられています。</p>
<p><b>A design and usability blog: Signal vs. Noise (by 37signals)</b><br />
　<a href="http://37signals.com/svn/posts/1944-dont-do-this-if-fileexistsmodel">http://37signals.com/svn/posts/1944-dont-do-this-if-fileexistsmodel</a></p>
<p></p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2009/09/dont_use_file_exists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AD] Railsが自社Webサービス開発に向く10+1の理由</title>
		<link>http://rails20.jp/2008/10/why_i_choice_ruby_on_rails/</link>
		<comments>http://rails20.jp/2008/10/why_i_choice_ruby_on_rails/#comments</comments>
		<pubDate>Tue, 28 Oct 2008 20:29:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[Webサイト]]></category>
		<category><![CDATA[開発]]></category>

		<guid isPermaLink="false">http://rails20.jp/2008/10/why_i_choice_ruby_on_rails/</guid>
		<description><![CDATA[


MOONGIFTではRailsによる受託開発、教育を行っております。そして今回、なぜRailsが良いのかという理由について挙げてみましたのでRails開発に迷いを感じられている方は参考にしていただければと思います。書いてあることは前々から言われているようなことばかりですが…。
まず第一前提としてよく「Railsは生産性が高い」と言われますが、今回は書かないようにしています。目に見えづらく、経験則によるものなのでかえって怪しく見えてしまうからです。数字にまで落とし込めれば良いのですが、正確性がないので今回は省きます。
詳細は以下より。

1. MVCがRailsのみで完結する
Railsはフレームワークであり統合システムプラットフォームです。他言語のフレームワークでは、Webアプリケーションサーバ、ビュー、O/Rマッピングとそれぞれ選定し組み合わせる必要があるのですが、Railsの場合はRailsさえあれば事足ります。ここを縛りと感じるか、不要な選択の手間を省いてくれるかは個人の考え方によります。が、Railsのコンセプトとして「設定より規約」というものがあります。まさにレール（Rail）に乗ることで快適なWebアプリケーション開発が行えるようになります。
選択を不要にすることで開発の開始が速く、知識の均質化がなされるようになります。
2. コーディング量が少ない
RailsはWebアプリケーション開発における基盤となる機能の殆どを実装しています。場合によっては殆どコーディングをせずに済むでしょう。コーディングが少なければバグが潜む可能性も減り、安定した動作が臨めるようになります。
また、多数のプラグインやRubyGemsを使うことにより、一般的な機能（認証やタグクラウド、コメント機能など）をコーディングなしで実現できます。これらの第三者による機能の提供もRailsの魅力になります。
コーディング量を少なくすることで素早い開発が可能になり、さらにバグも抑えることができます。
3. テスト機構が予め組み込まれている
Webアプリケーション開発に限らず、テストを自動化する仕組みはシステムの品質を上げるのに重要な要素になります。Railsではユニットテストを行う仕組みが予め組み込まれているので、ソフトウェアの選定に悩むことなく導入することが可能です。
開発の終盤ではテスト工程が飛ばされることがありますが、Railsを利用することで開発を効率化し、空いた時間をテストに割り当てることでシステムの品質を高め、よりよいものに仕上げることができるようになります。
4. 使い勝手の良いO/Rマッピング
Webアプリケーションにおいてはデータベースが重要な技術要素になります。が、RDBMS（リレーショナルデータベース管理システム）はSQLを介してアクセスするため、通常のプログラム言語とは切り離されて利用されてきました。利用方法が異なるために、SQLインジェクションのようなバグが潜む可能性を高くしています。
Railsで提供されるO/RマッピングシステムであるActiveRecordはそんなデータベースの存在を意識することなく利用できる優れたシステムです。全てRails側で処理を行ってくれるため、複雑なデータを取得する必要がなければ、SQLを書くことはありません。
リレーションに関する情報もRailsのモデル上に定義を行うだけで良く、容易に欲しいデータが取り出せるようになります。
5. Ajaxが容易に使える
これはAjaxを容易に行えるようにするprototype.jsによる力が大きい所ですが。Railsではprototype.jsをJavaScriptのコーディングなしで扱えます。これはprototype.jsの開発者であるSam Stephenson氏が37signals（Ruby on Railsの開発元）に在籍されていることも大きいでしょう。
prototype.jsではなくjQueryが好きな方はjRailsというプラグインを入れることでprototype.jsと同じ書き方でjQueryを使った多彩なアクション、Ajaxを実装できるようになります。
Webアプリケーションを作る上でAjaxの活用は欠かせなくなっています。Railsを使えばAjaxを容易に利用でき、さらにRailsとの親和性も高く簡単に機能を実装できます。
6. 柔軟なバリデーション機能
Railsのモデルにはバリデーションの機能が組み込まれています。データベースの値を参照したり、別な関数の実行結果によって振り分けたりと柔軟なチェックが可能です。モデルに組み込むことで、アクションごとのコーディング量が減り、コードも集約されて変更に対して柔軟に対応できるようになります。
7. 豊富なプラグイン
認証、タギング、コメント、全文検索、ファイルアップロード、ページネーション…Railsがいかに優秀であろうとも、WebアプリケーションにはRailsだけでは足りない機能が多数必要になります。が、それらは世界中の開発者がプラグインという形で開発を行い提供してくれています。これらを使うことで実装するとコーディング量が増えそうなものも、コードレスで実装できるようになります。
認証一つとっても様々な可能性があります。通常のWeb認証に加えてBasic認証やOpenIDを利用することもあります。こうした一つ一つの機能についてプラグインの存在を確かめれば、さらに素早くシステム開発が行えるようになります。
こうした機能をRailsの中に組み込んでしまうとフレームワーク全体が重厚になってしまいます。その取捨選択の妙技がRailsの良さとも言えます。
8. 多数のオープンソース・ソフトウェア
Railsを学ぶ方法は幾つかあります。書籍やWebの情報をもとに自分でコーディングしてみるのも一つですが、他人の書いたコードを見るのも一つです。Railsはその人気の高さもあって、多数のオープンソース・ソフトウェアが存在しています。MOONGIFTでも既に100近くのRuby on Railsを利用したWebアプリケーションを紹介しています。
また、自分の作りたいと思っているWebアプリケーションをオープンソース・ソフトウェアをベースに作り上げていくのも一つの手です。Railsはここ数年のWeb2.0の波に乗って出てきたフレームワークであるため、ソーシャルブックマークやソーシャルニュース、ブログ、マイクロブログ、SNSなど新しめのWebアプリケーションが多数存在しています。これらをベースに改造して自分なりのWebアプリケーションを構築するとさらに素早く構築ができるようになります。
先駆者たちの知識を吸収するのにRailsがオープンソースであることの利点は大きいと言えます。
9. 多数のWeb情報、書籍
数年前では考えられなかったのですが、Webや書籍でのRailsに関する情報は一気に増えてきました。とは言えRails自体の開発速度がはやく、書籍などがすぐに陳腐化してしまったり、最新のバージョンに対応できなくなってしまうことが多々ありますが…。
とは言え、Rails 2.0系（現在は2.1.2が最新）の情報もWebで探すと多数見つかるようになってきています。また、コミュニティに参加するのも良いでしょう。
10. アジャイル開発が行える
コーディング量が少なく機能が実現できるとあって、素早い開発が可能です。そのため、要望の変化にあわせて手早く開発ができるようになります。アジャイル開発では仕様を初期段階できっちりと決めるのではなく、ミーティングを重ねながら徐々にシステムを変えていく必要があります。その点、スクリプト言語であるRubyは変更が手早く反映されるのでアジャイル開発向きと言えます。
他のスクリプト言語に比べて言えば、Railsという柔軟かつ強固なフレームワークの力によりコーディングを少なく手早くアジャイル開発を行えるのがメリットです。
　
そして最後の理由が、
11. Rubyが日本製
ではないでしょうか。恐らくRubyが海外の言語であったとしたら、日本でここまでもてはやされることはなかったと思われます。とは言え、Ruby on Railsが優秀なフレームワークであるのには変わりはありません。
Railsに関して言えば特に日本語のサポートが充実しているということはありませんが、その元になったRubyが日本製（というよりまつもとゆきひろ氏製）だったからこそ、日本においてもここまでRailsが注目を集めていると言えるのではないでしょうか。
　
そしてそもそもの題名にある「自社Webサービス」という言葉についてです。個人的な観点で言えば、Railsは他社向けのシステム開発には向いていないと考えています。これらは幾つか要因があるのですが別の機会にて。簡潔に言うと「開発リソースの確保」「パフォーマンス保証」「多様なプラットフォームに対する情報量」などが問題です。そこで他社向けであれば簡易的なものはPHPやPerl、重厚なものはJavaなどを選択するのが良いのではないでしょうか。
自社サービスについて言えば、刻々と変わる利用者のニーズに対して素早く対応していく必要があります。そこには仮定に基づいた実験もあり、それらを素早くフィードバックできる仕組みが必要です。そのとき、アジャイル的な開発に向いたRailsはきっと役に立つはずです。
また、開発会社については未知の技術を使うよりも既知の技術を使った方が保証もでき、安全です。パフォーマンスの面でRailsが問題視されることも多く、最適なアーキテクチャもまだまだ情報が充実していません。その点、自社のWebサービスであれば初期段階は低コストに、利用者やPV増にあわせてシステム増強をはかることが可能です。
MOONGIFTにRailsの受託開発または開発協力を必要とされる方がいらっしゃいましたが、info@moongift.jpまでご連絡ください！
]]></description>
			<content:encoded><![CDATA[</p>
<p>
<img src="http://www.moongift.jp/wp-content/uploads/2008/10/rails.png" width="87" height="112" alt="rails.png" /></p>
<p>MOONGIFTではRailsによる受託開発、教育を行っております。そして今回、なぜRailsが良いのかという理由について挙げてみましたのでRails開発に迷いを感じられている方は参考にしていただければと思います。書いてあることは前々から言われているようなことばかりですが…。</p>
<p>まず第一前提としてよく「Railsは生産性が高い」と言われますが、今回は書かないようにしています。目に見えづらく、経験則によるものなのでかえって怪しく見えてしまうからです。数字にまで落とし込めれば良いのですが、正確性がないので今回は省きます。</p>
<p>詳細は以下より。</p>
<p><span id="more-57"></span></p>
<h2>1. MVCがRailsのみで完結する</h2>
<p>Railsはフレームワークであり統合システムプラットフォームです。他言語のフレームワークでは、Webアプリケーションサーバ、ビュー、O/Rマッピングとそれぞれ選定し組み合わせる必要があるのですが、Railsの場合はRailsさえあれば事足ります。ここを縛りと感じるか、不要な選択の手間を省いてくれるかは個人の考え方によります。が、Railsのコンセプトとして「設定より規約」というものがあります。まさにレール（Rail）に乗ることで快適なWebアプリケーション開発が行えるようになります。</p>
<p>選択を不要にすることで開発の開始が速く、知識の均質化がなされるようになります。</p>
<h2>2. コーディング量が少ない</h2>
<p>RailsはWebアプリケーション開発における基盤となる機能の殆どを実装しています。場合によっては殆どコーディングをせずに済むでしょう。コーディングが少なければバグが潜む可能性も減り、安定した動作が臨めるようになります。</p>
<p>また、多数のプラグインやRubyGemsを使うことにより、一般的な機能（認証やタグクラウド、コメント機能など）をコーディングなしで実現できます。これらの第三者による機能の提供もRailsの魅力になります。</p>
<p>コーディング量を少なくすることで素早い開発が可能になり、さらにバグも抑えることができます。</p>
<h2>3. テスト機構が予め組み込まれている</h2>
<p>Webアプリケーション開発に限らず、テストを自動化する仕組みはシステムの品質を上げるのに重要な要素になります。Railsではユニットテストを行う仕組みが予め組み込まれているので、ソフトウェアの選定に悩むことなく導入することが可能です。</p>
<p>開発の終盤ではテスト工程が飛ばされることがありますが、Railsを利用することで開発を効率化し、空いた時間をテストに割り当てることでシステムの品質を高め、よりよいものに仕上げることができるようになります。</p>
<h2>4. 使い勝手の良いO/Rマッピング</h2>
<p>Webアプリケーションにおいてはデータベースが重要な技術要素になります。が、RDBMS（リレーショナルデータベース管理システム）はSQLを介してアクセスするため、通常のプログラム言語とは切り離されて利用されてきました。利用方法が異なるために、SQLインジェクションのようなバグが潜む可能性を高くしています。</p>
<p>Railsで提供されるO/RマッピングシステムであるActiveRecordはそんなデータベースの存在を意識することなく利用できる優れたシステムです。全てRails側で処理を行ってくれるため、複雑なデータを取得する必要がなければ、SQLを書くことはありません。</p>
<p>リレーションに関する情報もRailsのモデル上に定義を行うだけで良く、容易に欲しいデータが取り出せるようになります。</p>
<h2>5. Ajaxが容易に使える</h2>
<p>これはAjaxを容易に行えるようにするprototype.jsによる力が大きい所ですが。Railsではprototype.jsをJavaScriptのコーディングなしで扱えます。これはprototype.jsの開発者であるSam Stephenson氏が37signals（Ruby on Railsの開発元）に在籍されていることも大きいでしょう。</p>
<p>prototype.jsではなくjQueryが好きな方はjRailsというプラグインを入れることでprototype.jsと同じ書き方でjQueryを使った多彩なアクション、Ajaxを実装できるようになります。</p>
<p>Webアプリケーションを作る上でAjaxの活用は欠かせなくなっています。Railsを使えばAjaxを容易に利用でき、さらにRailsとの親和性も高く簡単に機能を実装できます。</p>
<h2>6. 柔軟なバリデーション機能</h2>
<p>Railsのモデルにはバリデーションの機能が組み込まれています。データベースの値を参照したり、別な関数の実行結果によって振り分けたりと柔軟なチェックが可能です。モデルに組み込むことで、アクションごとのコーディング量が減り、コードも集約されて変更に対して柔軟に対応できるようになります。</p>
<h2>7. 豊富なプラグイン</h2>
<p>認証、タギング、コメント、全文検索、ファイルアップロード、ページネーション…Railsがいかに優秀であろうとも、WebアプリケーションにはRailsだけでは足りない機能が多数必要になります。が、それらは世界中の開発者がプラグインという形で開発を行い提供してくれています。これらを使うことで実装するとコーディング量が増えそうなものも、コードレスで実装できるようになります。</p>
<p>認証一つとっても様々な可能性があります。通常のWeb認証に加えてBasic認証やOpenIDを利用することもあります。こうした一つ一つの機能についてプラグインの存在を確かめれば、さらに素早くシステム開発が行えるようになります。</p>
<p>こうした機能をRailsの中に組み込んでしまうとフレームワーク全体が重厚になってしまいます。その取捨選択の妙技がRailsの良さとも言えます。</p>
<h2>8. 多数のオープンソース・ソフトウェア</h2>
<p>Railsを学ぶ方法は幾つかあります。書籍やWebの情報をもとに自分でコーディングしてみるのも一つですが、他人の書いたコードを見るのも一つです。Railsはその人気の高さもあって、多数のオープンソース・ソフトウェアが存在しています。MOONGIFTでも既に<a href="http://www.moongift.jp/category/framework/ruby_on_rails">100近くのRuby on Railsを利用したWebアプリケーション</a>を紹介しています。</p>
<p>また、自分の作りたいと思っているWebアプリケーションをオープンソース・ソフトウェアをベースに作り上げていくのも一つの手です。Railsはここ数年のWeb2.0の波に乗って出てきたフレームワークであるため、ソーシャルブックマークやソーシャルニュース、ブログ、マイクロブログ、SNSなど新しめのWebアプリケーションが多数存在しています。これらをベースに改造して自分なりのWebアプリケーションを構築するとさらに素早く構築ができるようになります。</p>
<p>先駆者たちの知識を吸収するのにRailsがオープンソースであることの利点は大きいと言えます。</p>
<h2>9. 多数のWeb情報、書籍</h2>
<p>数年前では考えられなかったのですが、Webや書籍でのRailsに関する情報は一気に増えてきました。とは言えRails自体の開発速度がはやく、書籍などがすぐに陳腐化してしまったり、最新のバージョンに対応できなくなってしまうことが多々ありますが…。</p>
<p>とは言え、Rails 2.0系（現在は2.1.2が最新）の情報もWebで探すと多数見つかるようになってきています。また、コミュニティに参加するのも良いでしょう。</p>
<h2>10. アジャイル開発が行える</h2>
<p>コーディング量が少なく機能が実現できるとあって、素早い開発が可能です。そのため、要望の変化にあわせて手早く開発ができるようになります。アジャイル開発では仕様を初期段階できっちりと決めるのではなく、ミーティングを重ねながら徐々にシステムを変えていく必要があります。その点、スクリプト言語であるRubyは変更が手早く反映されるのでアジャイル開発向きと言えます。</p>
<p>他のスクリプト言語に比べて言えば、Railsという柔軟かつ強固なフレームワークの力によりコーディングを少なく手早くアジャイル開発を行えるのがメリットです。</p>
<p>　</p>
<p>そして最後の理由が、</p>
<h2>11. Rubyが日本製</h2>
<p>ではないでしょうか。恐らくRubyが海外の言語であったとしたら、日本でここまでもてはやされることはなかったと思われます。とは言え、Ruby on Railsが優秀なフレームワークであるのには変わりはありません。</p>
<p>Railsに関して言えば特に日本語のサポートが充実しているということはありませんが、その元になったRubyが日本製（というよりまつもとゆきひろ氏製）だったからこそ、日本においてもここまでRailsが注目を集めていると言えるのではないでしょうか。</p>
<p>　</p>
<p>そしてそもそもの題名にある「自社Webサービス」という言葉についてです。個人的な観点で言えば、Railsは他社向けのシステム開発には向いていないと考えています。これらは幾つか要因があるのですが別の機会にて。簡潔に言うと「開発リソースの確保」「パフォーマンス保証」「多様なプラットフォームに対する情報量」などが問題です。そこで他社向けであれば簡易的なものはPHPやPerl、重厚なものはJavaなどを選択するのが良いのではないでしょうか。</p>
<p>自社サービスについて言えば、刻々と変わる利用者のニーズに対して素早く対応していく必要があります。そこには仮定に基づいた実験もあり、それらを素早くフィードバックできる仕組みが必要です。そのとき、アジャイル的な開発に向いたRailsはきっと役に立つはずです。</p>
<p>また、開発会社については未知の技術を使うよりも既知の技術を使った方が保証もでき、安全です。パフォーマンスの面でRailsが問題視されることも多く、最適なアーキテクチャもまだまだ情報が充実していません。その点、自社のWebサービスであれば初期段階は低コストに、利用者やPV増にあわせてシステム増強をはかることが可能です。</p>
<p><strong>MOONGIFTにRailsの受託開発または開発協力を必要とされる方がいらっしゃいましたが、</strong><a href="info@moongift.jp"><strong>info@moongift.jp</strong></a><strong>までご連絡ください！</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/10/why_i_choice_ruby_on_rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BackgrounDRbを使ってControllerのメソッドを呼び出す方法</title>
		<link>http://rails20.jp/2008/05/backgroundrb_and_controller/</link>
		<comments>http://rails20.jp/2008/05/backgroundrb_and_controller/#comments</comments>
		<pubDate>Thu, 08 May 2008 04:43:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://rails20.jp/2008/05/backgroundrb_and_controller/</guid>
		<description><![CDATA[が、いまいち分からなかったりします。やりたいことはApplicationController内に定義してある関数を呼び出す処理。BackgrounDRbの中で、expire_pageを呼び出したい時もあると思うので。キャッシュの生成処理をBackgrounDRb内でやらせるのは高速化につながるのではないかと思います。そうすると、キャッシュの生成にかかるコストをバッググラウンドでやらせつつ、表示が高速化できるようになります。
妥協的な方法は以下。

How to Execute a Rails Controller Action via. Cron [ Mr. Matt ]を参考にすると、以下のようになります。

class FunctionWorker &#60; BackgrounDRb::Rails
　def do_work(args)
　　： # 何かの処理
　　app = ActionController::Integration::Session.new
　　posts.each { &#124;some&#124;
　　　app.get "some_controller/some_method/#{some.id}"
　　}
end
こうすると普通にコントローラーが利用できるようになります。やっていることはHTTPアクセスと変わらないので、どうしてもという時だけになるでしょうが。
]]></description>
			<content:encoded><![CDATA[<p>が、いまいち分からなかったりします。やりたいことはApplicationController内に定義してある関数を呼び出す処理。BackgrounDRbの中で、expire_pageを呼び出したい時もあると思うので。キャッシュの生成処理をBackgrounDRb内でやらせるのは高速化につながるのではないかと思います。そうすると、キャッシュの生成にかかるコストをバッググラウンドでやらせつつ、表示が高速化できるようになります。</p>
<p>妥協的な方法は以下。</p>
<p><span id="more-56"></span></p>
<p><a href="http://matthall.wordpress.com/2006/12/06/how-to-execute-a-rails-controller-action-via-cron/">How to Execute a Rails Controller Action via. Cron</a> [ Mr. Matt ]を参考にすると、以下のようになります。</p>
<p><code><br />
class FunctionWorker &lt; BackgrounDRb::Rails<br />
　def do_work(args)<br />
　　： # 何かの処理<br />
　　app = ActionController::Integration::Session.new<br />
　　posts.each { |some|<br />
　　　app.get "some_controller/some_method/#{some.id}"<br />
　　}<br />
end<br /></code></p>
<p>こうすると普通にコントローラーが利用できるようになります。やっていることはHTTPアクセスと変わらないので、どうしてもという時だけになるでしょうが。</p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/05/backgroundrb_and_controller/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSSとHTML、そしてRailsを使ってPDFを作成するTips</title>
		<link>http://rails20.jp/2008/04/css_html_to_pdf_using_rails/</link>
		<comments>http://rails20.jp/2008/04/css_html_to_pdf_using_rails/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 07:24:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://rails20.jp/2008/04/css_html_to_pdf_using_rails/</guid>
		<description><![CDATA[

subLog : HTML / CSS to PDF using Ruby on Rails
　
答えを言ってしまうと、Prince XMLを使います。各種プラットフォーム向けに提供されているライブラリなので、これを使えば手軽に作成できそうです。そのためのライブラリprince.rbとpdf_helper.rbが公開されています。ちなみにPrince XMLは個人の非商用利用に限りフリーのライブラリなのでご注意ください。


Prince XMLのトップページ
　
subLog : HTML / CSS to PDF using Ruby on Rails
　http://sublog.subimage.com/articles/2007/05/29/html-css-to-pdf-using-ruby-on-rails
]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://rails20.jp/wp-content/uploads/22.jpg"><img src="http://rails20.jp/wp-content/uploads/2-tm1.jpg" width="440" height="349" alt="ピクチャ 2.png" /></a></p>
<p><strong>subLog : HTML / CSS to PDF using Ruby on Rails</strong></p>
<p>　</p>
<p>答えを言ってしまうと、<a href="http://www.moongift.jp/2007/12/prince/">Prince XML</a>を使います。各種プラットフォーム向けに提供されているライブラリなので、これを使えば手軽に作成できそうです。そのためのライブラリprince.rbとpdf_helper.rbが公開されています。ちなみにPrince XMLは個人の非商用利用に限りフリーのライブラリなのでご注意ください。</p>
<p>
<a href="http://rails20.jp/wp-content/uploads/12.jpg"><img src="http://rails20.jp/wp-content/uploads/1-tm.jpg" width="440" height="349" alt="ピクチャ 1.png" /></a><br />
<strong><a href="http://www.moongift.jp/2007/12/prince/">Prince XML</a>のトップページ</strong></p>
<p>　</p>
<p><strong>subLog : HTML / CSS to PDF using Ruby on Rails<br />
<span style="font-weight: normal;">　<a href="http://sublog.subimage.com/articles/2007/05/29/html-css-to-pdf-using-ruby-on-rails">http://sublog.subimage.com/articles/2007/05/29/html-css-to-pdf-using-ruby-on-rails</a></span></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/04/css_html_to_pdf_using_rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Railsで開発するときにはキャッシュを予め想定に入れておく</title>
		<link>http://rails20.jp/2008/04/cache_tips/</link>
		<comments>http://rails20.jp/2008/04/cache_tips/#comments</comments>
		<pubDate>Tue, 08 Apr 2008 12:33:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[開発]]></category>

		<guid isPermaLink="false">http://rails20.jp/2008/04/cache_tips/</guid>
		<description><![CDATA[

via En attendant Jérémie on Flickr &#8211; Photo Sharing!
　
今回、まともにキャッシュを使おうと思い始めたのですが、ある程度組み上げた段階でキャッシュを組み入れようとすると色々問題が起こることが分かりました。まず知識としては、Railsのキャッシュは3パターンあります。

Page
Action
Fragment

があります。Pageは一番強力で、一度生成後はApacheやlighttpdなどのWebサーバレベルでレスポンスを返してくれます。アプリケーションサーバを通さない分、高速です。が、逆に言えば生成した後はRails側で制御できない状態になるので、表示を細かに変更することはできません。
次にAction Cacheがあります。これはPageアクション同様に生成されるページ全体をキャッシングしますが、Railsのアクションは実行するという点が異なります。アクションを通るので、DBにアクセスして情報を取得することが可能というメリットはありますが、DBへのアクセスがボトルネックになっている場合は使えません。
最後にFragmentキャッシュです。これはViewの中で細かく利用できます。言わば部品を定義していくことで、一部分だけの表示をキャッシングしていくことができます。細かく制御できる利点はありますが、裏を返せば多数使うと管理が大変になります。
では次に問題点や解決策を挙げてみたいと思います。


まず、レンダリングの高速化を考えてできるだけPageキャッシングを使っていきたいと思います。が、ログイン後に出す「○○さんいらっしゃい」という系統のメッセージを出す場合は問題です。これの解決策としては幾つかあるのですが、今回はJavaScriptとCookieで解決しました。
ログイン時にCookieに対してログイン名を渡します。
cookies[:login] = name
これでCookieレベルでログイン名が渡せるようになります。次にビュー側では、

&#60;div id="logged_in"&#62;　&#60;%= link_to _("My page"), :controller =&#62; :memo, :action =&#62; :mypage %&#62;
　(&#60;%= link_to _("Settings"), :controller =&#62; :account, :action =&#62; :settings %&#62;)
　&#60;%= link_to _("Log out"), :controller =&#62; :account, :action =&#62; :logout %&#62;
&#60;/div&#62;
&#60;div id="logged_out"&#62;
　&#60;%= link_to _("Login"), :controller =&#62; :account, :action =&#62; :login %&#62;
&#60;/div&#62;

という形で、ログイン時とログアウト時の両方を書いておきます。その状態でJavaScriptを使います。ここではクッキーの制御が簡単にできるCookieManagerを使いました。
Cookie Manager &#124; Javascript [...]]]></description>
			<content:encoded><![CDATA[<p>
<a href="http://rails20.jp/wp-content/uploads/463339300-9544e80701.jpg"><img src="http://rails20.jp/wp-content/uploads/463339300-9544e80701-tm.jpg" width="440" height="293" alt="463339300_9544e80701.jpg" /></a></p>
<p>via <a href="http://www.flickr.com/photos/73491156@N00/463339300">En attendant Jérémie on Flickr &#8211; Photo Sharing!</a></p>
<p>　</p>
<p>今回、まともにキャッシュを使おうと思い始めたのですが、ある程度組み上げた段階でキャッシュを組み入れようとすると色々問題が起こることが分かりました。まず知識としては、Railsのキャッシュは3パターンあります。</p>
<ul>
<li>Page</li>
<li>Action</li>
<li>Fragment</li>
</ul>
<p>があります。Pageは一番強力で、一度生成後はApacheやlighttpdなどのWebサーバレベルでレスポンスを返してくれます。アプリケーションサーバを通さない分、高速です。が、逆に言えば生成した後はRails側で制御できない状態になるので、表示を細かに変更することはできません。</p>
<p>次にAction Cacheがあります。これはPageアクション同様に生成されるページ全体をキャッシングしますが、Railsのアクションは実行するという点が異なります。アクションを通るので、DBにアクセスして情報を取得することが可能というメリットはありますが、DBへのアクセスがボトルネックになっている場合は使えません。</p>
<p>最後にFragmentキャッシュです。これはViewの中で細かく利用できます。言わば部品を定義していくことで、一部分だけの表示をキャッシングしていくことができます。細かく制御できる利点はありますが、裏を返せば多数使うと管理が大変になります。</p>
<p>では次に問題点や解決策を挙げてみたいと思います。</p>
<p></p>
<p><span id="more-29"></span></p>
<p>まず、レンダリングの高速化を考えてできるだけPageキャッシングを使っていきたいと思います。が、ログイン後に出す「○○さんいらっしゃい」という系統のメッセージを出す場合は問題です。これの解決策としては幾つかあるのですが、今回はJavaScriptとCookieで解決しました。</p>
<p>ログイン時にCookieに対してログイン名を渡します。</p>
<p><code>cookies[:login] = name</code></p>
<p>これでCookieレベルでログイン名が渡せるようになります。次にビュー側では、</p>
<p><code><br />
&lt;div id="logged_in"&gt;</code><code>　&lt;%= link_to _("My page"), :controller =&gt; :memo, :action =&gt; :mypage %&gt;<br />
　(&lt;%= link_to _("Settings"), :controller =&gt; :account, :action =&gt; :settings %&gt;)<br />
　&lt;%= link_to _("Log out"), :controller =&gt; :account, :action =&gt; :logout %&gt;<br />
&lt;/div&gt;<br />
&lt;div id="logged_out"&gt;<br />
　&lt;%= link_to _("Login"), :controller =&gt; :account, :action =&gt; :login %&gt;<br />
&lt;/div&gt;<br /></code></p>
<div id="logged_out"></div>
<p>という形で、ログイン時とログアウト時の両方を書いておきます。その状態でJavaScriptを使います。ここではクッキーの制御が簡単にできるCookieManagerを使いました。</p>
<p><strong>Cookie Manager | Javascript Code | All Things Webby</strong><br />
　http://insin.woaf.net/code/javascript/cookiemanager.html</p>
<p><code><br />
function handle_cached_user() {<br />
　var manager = new CookieManager({shelfLife:30});<br />
　var logged_in = $('logged_in');<br />
　var logged_out = $('logged_out');<br />
　if(manager.getCookie('login') == null) {<br />
　　logged_in.style.display = 'none';<br />
　　logged_out.style.display = 'inline';<br />
　} else {<br />
　　logged_out.style.display = 'none';<br />
　　logged_in.style.display = 'inline';<br />
　}<br />
　message = manager.getCookie('message');<br />
　if (message != null) {<br />
　　$("notice").innerHTML = decodeURIComponent(message).replace(/\+/g, " ");<br />
　　manager.setCookie("message", "");<br />
　}<br />
}</code></p>
<p>という風にして、loginというクッキーが存在するならログイン状態に、なければ未ログイン状態としてHTML側の表示を制御しています。この場合の問題点としては、JavaScriptレベルでの制御なので、それを基準にサーバ側の処理は行ってはいけないということがあります。サーバ側は別なセッションなりできちんとアクセス制限を行う必要があります。</p>
<p>が、この方法を使えば、パブリックな情報は殆どPageキャッシュレベルにすることが可能です。</p>
<p>Pageキャッシングの問題として、ページネーションを使った場合の処理があります。これはURLの?以下の文字はキャッシングを別にしてくれないということが問題です。そのため、pageをroute.rbに組み入れておくと、1.htmlのようなページネーションに対応したHTMLファイルを生成してくれるようになります。</p>
<p>map.connect &#8216;memo/index/:id/:page&#8217;, :controller =&gt; &#8216;memo&#8217;, :action =&gt; &#8216;index&#8217;, :requirements =&gt; { :page =&gt; /\d+/}, :page =&gt; nil</p>
<p>Actionキャッシングは今回は使いませんでした。できるだけDBに接続しないような方法を考えた場合、Actionキャッシングでは中途半端でした。</p>
<p>Fragmentキャッシングは様々な場所で利用しています。例えば、今回はデータベースには簡単なデータのみを保存し、文字情報はAmazon S3に保存しています。これはMogileFSなどの分散化ファイルシステムを使った場合でも同様ですが、HTTPベースでのアクセスになるので速度的に不利です。そのため、必要なデータはキャッシングし、できるだけ接続しないようにしながらストレージを活用していくのが重要です。</p>
<p>当初はモデルのafter_findを使って、データベースからデータを取得した際に、それに関連するデータをAmazon S3から取得する形にしていたのですが、Fragmentキャッシュを利用するにあたって、Amazon S3に極力接続しない形に移行しました。</p>
<p>また、ログインしている否か、マイページなのか否かによって細かく表示を制御している場合、Fragmentキャッシュは相当増える可能性があります。そして増えすぎるとその管理が煩雑になります。そこで解決手段としては、そうした表示上の制御をできるだけ除いてしまうということがあります。ログイン時にしか使えない機能も表示してしまうことで、それがクリックされた際にはログインのページを表示するといった方法や、エラーメッセージを出すという手法をとるようにします。また、それらをJavaScriptで制御するという方法も可能ではありますが、JavaScriptにあまり頼りすぎるのも問題があります。</p>
<p>次の問題として、エラーメッセージがあります。例えばflash[:notice]を使ってエラーメッセージを出した場合、エラーメッセージが表示された状態でキャッシュが作成され、固定化されてしまいます。これだと、別なユーザが見た場合や、再読み込みした場合でも同じエラーメッセージが出続けます。これはCookieレベルでエラーメッセージを出すようにすると解決します。cookie[:message] = &#8220;hogehoge&#8221;でメッセージを与えておき、表示側でCookieにメッセージがあればそれを表示し、Cookieを消すという動作です。</p>
<p>これらの方法を後から行うと、パブリックなアクションとマイページ系のアクションを別にしたり、レイアウトも別にしたりと修正が相当入ります。元々想定しながら作っておくのが一番です。</p>
<p>PageキャッシングとFragmentキャッシングを活用することで、速度的には相当改善されるようになりました。CookieやJavaScriptたよりになるデメリットもありますが、単なる表示制御だけで、アクセス権限の制御はサーバ側できちんと行っている限りはそれほど問題にはならないかと思います。Railsは他のフレームワークに比べると速度面のデメリットが大きいと思いますので、キャッシングをうまく使って速度向上を行ってみてください。</p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/04/cache_tips/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AtomFeedHelperを使ってネームスペース定義</title>
		<link>http://rails20.jp/2008/03/atomfeedhelper_add_namespaces/</link>
		<comments>http://rails20.jp/2008/03/atomfeedhelper_add_namespaces/#comments</comments>
		<pubDate>Tue, 11 Mar 2008 12:55:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://rails20.jp/2008/03/atomfeedhelper_add_namespaces/</guid>
		<description><![CDATA[結構はまった。結局のところバグのようで。次のリリースでは修正されるはずです。
views/hoge/index.atom.builder内において、
atom_feed({&#8217;xmlns:openSearch&#8217; =&#62; &#8216;http://a9.com/-/spec/opensearch/1.1/&#8217;}) do &#124;feed&#124;
等と定義しても無視されます。ソースは「actionpack-2.0.2/lib/action_view/helpers/atom_feed_helper.rb」で、ネームスペースっぽい定義が見つからない。
Module: ActionView::Helpers::AtomFeedHelper
　http://caboo.se/doc/classes/ActionView/Helpers/AtomFeedHelper.html#M006099
ここを見る限り、

Other namespaces can be added to the root element:

  app/views/posts/index.atom.builder:
    atom_feed({'xmlns:app' =&#62; 'http://www.w3.org/2007/app',
        'xmlns:openSearch' =&#62; 'http://a9.com/-/spec/opensearch/1.1/'}) do &#124;feed&#124;



と書かれてはいるのだが、ソースを見る限りできそうにない。で、探してみたらパッチがあった。
#10304 ([PATCH] Atom feed helper should allow to add new namespaces to the feed root element) &#8211; Rails Trac &#8211; Trac
　http://dev.rubyonrails.org/ticket/10304

86 feed_opts [...]]]></description>
			<content:encoded><![CDATA[<p>結構はまった。結局のところバグのようで。次のリリースでは修正されるはずです。</p>
<p>views/hoge/index.atom.builder内において、</p>
<p>atom_feed({&#8217;xmlns:openSearch&#8217; =&gt; &#8216;http://a9.com/-/spec/opensearch/1.1/&#8217;}) do |feed|</p>
<p>等と定義しても無視されます。ソースは「actionpack-2.0.2/lib/action_view/helpers/atom_feed_helper.rb」で、ネームスペースっぽい定義が見つからない。</p>
<p>Module: ActionView::Helpers::AtomFeedHelper<br />
　<a href="http://caboo.se/doc/classes/ActionView/Helpers/AtomFeedHelper.html#M006099">http://caboo.se/doc/classes/ActionView/Helpers/AtomFeedHelper.html#M006099</a></p>
<p>ここを見る限り、</p>
<pre>
<code>Other namespaces can be added to the root element:

  app/views/posts/index.atom.builder:
    atom_feed({'xmlns:app' =&gt; 'http://www.w3.org/2007/app',
        'xmlns:openSearch' =&gt; 'http://a9.com/-/spec/opensearch/1.1/'}) do |feed|

</code>
</pre>
<p>と書かれてはいるのだが、ソースを見る限りできそうにない。で、探してみたらパッチがあった。</p>
<p><strong>#10304 ([PATCH] Atom feed helper should allow to add new namespaces to the feed root element) &#8211; Rails Trac &#8211; Trac</strong><br />
　<a href="http://dev.rubyonrails.org/ticket/10304">http://dev.rubyonrails.org/ticket/10304</a></p>
<pre>
<code>86 feed_opts = {"xml:lang" =&gt; options[:language] || "en-US", "xmlns" =&gt; 'http://www.w3.org/2005/Atom'}
87 feed_opts.merge!(options).reject!{|k,v| !k.to_s.match(/^xml/)}
88
89 xml.feed(feed_opts) do
</code>
</pre>
<p>この辺りが修正範囲。xml〜ではじまっていればネームスペースとして見なす模様。これで無事、Atomフィードに任意のネームスペースが追加できるようになる。</p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/03/atomfeedhelper_add_namespaces/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails2.0によるAtom/RSSフィードの実装（GET）</title>
		<link>http://rails20.jp/2008/03/rails20_atom_rss/</link>
		<comments>http://rails20.jp/2008/03/rails20_atom_rss/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 12:20:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://rails20.jp/2008/03/rails20_atom_rss/</guid>
		<description><![CDATA[AtomPubっぽいものを出力する方法です。

http://localhost:3000/example/index　HTML
http://localhost:3000/example/index.rss　RSS2.0
http://localhost:3000/example/index.atom　Atom

という形で定義します。
Rails2.0の場合は、フォーマットによって出力を簡単に変更できますので、それを使います。

    respond_to do &#124;format&#124;
      format.html
      format.atom {
        render(:layout =&#62; false)
      }
      format.rss {
        render(:layout =&#62; false, :action =&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>AtomPubっぽいものを出力する方法です。</p>
<ul>
<li>http://localhost:3000/example/index　HTML</li>
<li>http://localhost:3000/example/index.rss　RSS2.0</li>
<li>http://localhost:3000/example/index.atom　Atom</li>
</ul>
<p>という形で定義します。</p>
<p>Rails2.0の場合は、フォーマットによって出力を簡単に変更できますので、それを使います。</p>
<pre>
<code>    respond_to do |format|
      format.html
      format.atom {
        render(:layout =&gt; false)
      }
      format.rss {
        render(:layout =&gt; false, :action =&gt; "index.rxml")
      }
    end
</code>
</pre>
<p>これで、Atomの場合は/views/example/index.atom.builderが、RSSの場合は/views/example/index.rxmlが読み込まれます。</p>
<p>Atomのテンプレートは以下のようになります。</p>
<pre>
<code>atom_feed do |feed|
  feed.title("#{@title} » Example Feed")
  feed.updated(@memos.first.created_at)

  @memos.each do |m|
    feed.entry(m, :url =&gt; create_link(m)) do |entry|
      entry.title(m.title)
      entry.content(trans(m), :type =&gt; "html")
      entry.author do |a|
        a.name(@user.name)
      end
    end
  end
end
</code>
</pre>
<p>これはベースのようなものです。@memosというリストごとにフィードのエントリーを定義して、タイトルやcontentを作成しています。次にRSS側も同様に処理できます。</p>
<pre>
<code>
xml.instruct! <img src='http://rails20.jp/wp-includes/images/smilies/icon_mad.gif' alt=':x' class='wp-smiley' /> ml, :version =&gt; "1.0", :encoding =&gt; "UTF-8"
xml.rss('version' =&gt; '2.0', 'xmlns:atom' =&gt; 'http://www.w3.org/2005/Atom', 'xmlns:openSearch' =&gt; 'http://a9.com/-/spec/opensearchrss/1.0/') do
  xml.channel do
    xml.title @title
    url = url_for(:controller =&gt; :memo, :action =&gt; :index, :id =&gt; @user.name, <img src='http://rails20.jp/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly_path =&gt; false)
    xml.link url
    xml.tag!("atom:id", url)
    xml.description(@title)
    xml.language "en-us"
    xml.ttl "40"
    xml.pubDate(Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z"))
    xml.managingEditor(@user.name)
    xml.generator("Jot a Memo")
    xml.tag!("openSearch:totalResults", @memos.paginate.total_entries)
    xml.tag!("openSearch:startIndex", @startIndex)
    xml.tag!("openSearch:itemsPerPage", @perpage)
    xml.guid(url, "isPermaLink" =&gt; 'false')
    xml.tag!("atom:updated", Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z"))
    @memos.each do |m|
      xml.item do
        xml.title(m.title)
        xml.tag!('atom:id', create_link(m))
        xml.guid(create_link(m), "isPermaLink" =&gt; 'false')
        xml.pubDate(m.created_at)
        xml.tag!("atom:updated", m.updated_at)
        xml.tag!("atom:summary", trans(m))
        xml.link(create_link(m))
        xml.description(trans(m))
        xml.guid(create_link(m))
        xml.author(m.user.name)
      end
    end
  end
end
</code>
</pre>
<p>やたらと長いのですが、あまり気にしないでください。大事なのは、xml.tag!を使うと、&lt;atom:id&gt;…&lt;/atom:id&gt;のような形式が定義できるということと、xml.guid(aa, bb)のように二つ目の引数を定義すると、それがattributesになるということです。</p>
<p>後は&lt;rss&gt;の中に拡張書式を定義する場合があると思いますが、それもHashで指定可能です。</p>
<p>このように定義しておくと、次に以下のようなURLを考えた場合も容易に対応できます。</p>
<ul>
<li>http://localhost:3000/example/view/id　HTML</li>
<li>http://localhost:3000/example/view/id.rss　RSS2.0</li>
<li>http://localhost:3000/example/view/id.atom　Atom</li>
</ul>
<p>でidで指定されたデータの詳細表示を行う場合です。この場合は以下のように対応します。</p>
<pre>
<code>
    @memos = [@memo]
    respond_to do |format|
      format.html
      format.atom {
        render(:layout =&gt; false, :action =&gt; "index.atom.builder")
      }
      format.rss {
        render(:layout =&gt; false, :action =&gt; "index.rxml")
      }
    end
</code>
</pre>
<p>@memoという1件のデータを@memosに配列で入れた以外は、indexと同じ処理になります。実際、フィードで1件を表示する場合も複数件表示する場合も処理は変わらないので、これで対応できます。もちろん、HTMLの場合は異なると思いますので、view.rhtmlは内容が異なるかと思います。</p>
<p>とは言ってもこれではGETだけの対応なので、これからPOST/PUT/DELETEの実装を完了してはじめてAtomPubへの対応が完了したと言えるのですが。</p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/03/rails20_atom_rss/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyでGoogle Contacts Data APIを呼び出す</title>
		<link>http://rails20.jp/2008/03/ruby_google_contacts_data_api/</link>
		<comments>http://rails20.jp/2008/03/ruby_google_contacts_data_api/#comments</comments>
		<pubDate>Mon, 10 Mar 2008 05:35:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>
<category></category>
		<guid isPermaLink="false">http://rails20.jp/2008/03/ruby%e3%81%a7google-contacts-data-api%e3%82%92%e5%91%bc%e3%81%b3%e5%87%ba%e3%81%99/</guid>
		<description><![CDATA[
まだ基礎だけですが。とりあえず使うのはGDataライブラリです。
$ sudo gem install gdataSuccessfully installed GData-0.0.4Installing ri documentation for GData-0.0.4&#8230;Installing RDoc documentation for GData-0.0.4&#8230;
スクリプトは以下のように。
/opt/local/lib/ruby/gems/1.8/gems/GData-0.0.4/lib/gdata/google_contact.rb
require 'gdata/base'
require 'builder'
module GData
class GoogleContact &#60; GData::Base
def initialize
super 'cp', 'gdata-ruby', 'www.google.com'
end
　def list
request "/m8/feeds/contacts/#{@email}/base"
end
　def authenticate(email, password)
@email = email
super email, password
end
end
使い方は簡単で、
require &#8216;gdata/google_contact&#8217;
&#62;&#62; gc = GData::GoogleContact.new
=&#62; #&#60;GData::GoogleContact:0&#215;157cd34 @url=&#8221;www.google.com&#8221;, @source=&#8221;gdata-ruby&#8221;, @service=&#8221;cp&#8221;&#62;
&#62;&#62; gc.authenticate &#8220;example@gmail.com&#8221;, &#8220;[your password]&#8221;
=&#62; {&#8221;Authorization&#8221;=&#62;&#8221;GoogleLogin auth=&#8230;\n&#8221;, &#8220;Content-Type&#8221;=&#62;&#8221;application/atom+xml&#8221;}
&#62;&#62; gc.list
でリストがXMLで返ってきます。本当はこれをさらに解析してvCard形式とかでもとれるようになっていると便利そう。実際に返ってくるデータは次のような感じ（整形しています）。
=&#62; &#8221;
&#60;?xml version=&#8217;1.0&#8242; encoding=&#8217;UTF-8&#8242;?&#62;
&#60;feed xmlns=&#8217;http://www.w3.org/2005/Atom&#8217; xmlns:openSearch=&#8217;http://a9.com/-/spec/opensearchrss/1.0/&#8217; xmlns:gContact=&#8217;http://schemas.google.com/contact/2008&#8242; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://rails20.jp/wp-content/uploads/10.jpg"><img src="http://rails20.jp/wp-content/uploads/10-tm.jpg" alt="ピクチャ 10.png" height="276" width="440" /></a></p>
<p>まだ基礎だけですが。とりあえず使うのはGDataライブラリです。</p>
<p>$ sudo gem install gdataSuccessfully installed GData-0.0.4Installing ri documentation for GData-0.0.4&#8230;Installing RDoc documentation for GData-0.0.4&#8230;</p>
<p>スクリプトは以下のように。<br />
/opt/local/lib/ruby/gems/1.8/gems/GData-0.0.4/lib/gdata/google_contact.rb</p>
<p><code>require 'gdata/base'<br />
require 'builder'<br />
module GData<br />
class GoogleContact &lt; GData::Base<br />
def initialize<br />
super 'cp', 'gdata-ruby', 'www.google.com'<br />
end</code></p>
<p><code>　def list<br />
request "/m8/feeds/contacts/#{@email}/base"<br />
end</code></p>
<p><code>　def authenticate(email, password)<br />
@email = email<br />
super email, password<br />
end<br />
end</code></p>
<p><span style="font-family: Monaco">使い方は簡単で、</span></p>
<p><span style="font-family: Monaco">require &#8216;gdata/google_contact&#8217;<br />
&gt;&gt; gc = GData::GoogleContact.new<br />
=&gt; #&lt;GData::GoogleContact:0&#215;157cd34 @url=&#8221;www.google.com&#8221;, @source=&#8221;gdata-ruby&#8221;, @service=&#8221;cp&#8221;&gt;<br />
&gt;&gt; gc.authenticate &#8220;example@gmail.com&#8221;, &#8220;[your password]&#8221;<br />
=&gt; {&#8221;Authorization&#8221;=&gt;&#8221;GoogleLogin auth=&#8230;\n&#8221;, &#8220;Content-Type&#8221;=&gt;&#8221;application/atom+xml&#8221;}<br />
&gt;&gt; gc.list</span></p>
<p>でリストがXMLで返ってきます。本当はこれをさらに解析してvCard形式とかでもとれるようになっていると便利そう。実際に返ってくるデータは次のような感じ（整形しています）。<br />
=&gt; &#8221;<br />
&lt;?xml version=&#8217;1.0&#8242; encoding=&#8217;UTF-8&#8242;?&gt;<br />
&lt;feed xmlns=&#8217;http://www.w3.org/2005/Atom&#8217; xmlns:openSearch=&#8217;http://a9.com/-/spec/opensearchrss/1.0/&#8217; xmlns:gContact=&#8217;http://schemas.google.com/contact/2008&#8242; xmlns:gd=&#8217;http://schemas.google.com/g/2005&#8242;&gt;<br />
&lt;id&gt;example@gmail.com&lt;/id&gt;<br />
&lt;updated&gt;2008-03-10T05:05:34.160Z&lt;/updated&gt;<br />
&lt;category scheme=&#8217;http://schemas.google.com/g/2005#kind&#8217; term=&#8217;http://schemas.google.com/contact/2008#contact&#8217;/&gt;<br />
&lt;title type=&#8217;text&#8217;&gt;Atsushi Nakatsugawa&#8217;s Contacts&lt;/title&gt;<br />
&lt;link rel=&#8217;alternate&#8217; type=&#8217;text/html&#8217; href=&#8217;http://www.google.com/&#8217;/&gt;<br />
&lt;link rel=&#8217;http://schemas.google.com/g/2005#feed&#8217; type=&#8217;application/atom+xml&#8217; href=&#8217;http://www.google.com/m8/feeds/contacts/moongift%40gmail.com/base&#8217;/&gt;<br />
&lt;link rel=&#8217;http://schemas.google.com/g/2005#post&#8217; type=&#8217;application/atom+xml&#8217; href=&#8217;http://www.google.com/m8/feeds/contacts/moongift%40gmail.com/base&#8217;/&gt;<br />
&lt;link rel=&#8217;self&#8217; type=&#8217;application/atom+xml&#8217; href=&#8217;http://www.google.com/m8/feeds/contacts/moongift%40gmail.com/base?max-results=25&#8242;/&gt;<br />
&lt;link rel=&#8217;next&#8217; type=&#8217;application/atom+xml&#8217; href=&#8217;http://www.google.com/m8/feeds/contacts/moongift%40gmail.com/base?start-index=26&amp;max-results=25&#8242;/&gt;<br />
&lt;author&gt;<br />
&lt;name&gt;Atsushi Nakatsugawa&lt;/name&gt;<br />
&lt;email&gt;example@gmail.com&lt;/email&gt;<br />
&lt;/author&gt;<br />
&lt;generator version=&#8217;1.0&#8242; uri=&#8217;http://www.google.com/m8/feeds&#8217;&gt;Contacts&lt;/generator&gt;<br />
&lt;openSearch:totalResults&gt;376&lt;/openSearch:totalResults&gt;<br />
&lt;openSearch:startIndex&gt;1&lt;/openSearch:startIndex&gt;<br />
&lt;openSearch:itemsPerPage&gt;25&lt;/openSearch:itemsPerPage&gt;<br />
&lt;entry&gt;<br />
&lt;id&gt;http://www.google.com/m8/feeds/contacts/moongift%40gmail.com/base/0&lt;/id&gt;<br />
&lt;updated&gt;2007-11-26T02:27:10.592Z&lt;/updated&gt;<br />
&lt;category scheme=&#8217;http://schemas.google.com/g/2005#kind&#8217; term=&#8217;http://schemas.google.com/contact/2008#contact&#8217;/&gt;<br />
&lt;title type=&#8217;text&#8217;&gt;Atsushi Nakatsugawa&lt;/title&gt;<br />
&lt;link rel=&#8217;self&#8217; type=&#8217;application/atom+xml&#8217; href=&#8217;http://www.google.com/m8/feeds/contacts/moongift%40gmail.com/base/0&#8242;/&gt;<br />
&lt;link rel=&#8217;edit&#8217; type=&#8217;application/atom+xml&#8217; href=&#8217;http://www.google.com/m8/feeds/contacts/moongift%40gmail.com/base/0/1196044030592000&#8242;/&gt;<br />
&lt;gd:email rel=&#8217;http://schemas.google.com/g/2005#other&#8217; address=&#8217;example@moongift.jp&#8217; primary=&#8217;true&#8217;/&gt;<br />
&lt;/entry&gt;<br />
：<br />
タイトルにユーザ名が入って、gd:emailのaddressにメールアドレスが入る形ですね。個別で取得する場合はidを利用するようです。その他、住所などのデータも入っている場合は取得できます。とは言え、http://schemas.google.com/g/2005が見られないので、項目の詳細は不明です。</p>
<p><span style="font-family: Monaco">が、メールアドレスのリストだけであればこれで取得できるので便利です。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/03/ruby_google_contacts_data_api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>will_paginate + acts_as_searchableで全文検索＋ページネーション</title>
		<link>http://rails20.jp/2008/03/will_paginate-acts_as_searchable/</link>
		<comments>http://rails20.jp/2008/03/will_paginate-acts_as_searchable/#comments</comments>
		<pubDate>Tue, 04 Mar 2008 05:46:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tips]]></category>
		<category><![CDATA[プラグイン]]></category>
<category></category>
		<guid isPermaLink="false">http://rails20.jp/2008/03/will_paginate-acts_as_searchable%e3%81%a7%e5%85%a8%e6%96%87%e6%a4%9c%e7%b4%a2%ef%bc%8b%e3%83%9a%e3%83%bc%e3%82%b8%e3%83%8d%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3/</guid>
		<description><![CDATA[Rails2.0からページネーションがプラグインベースになりました。普通のページネーションであれば、
@memos = @user.memos.paginate(:page =&#62; params[:page], :per_page =&#62; 10,  rder=&#62;&#8221;memos.id DESC&#8221;)
だけで使えるようになって便利ですが、任意の情報に対してページネーションする方法がいまいち分かっていませんでした。そして、acts_as_searchableを使って、HyperEstraierで全文検索を行う際に、ページネーションをどのように行えば良いのか調べつつ分かったところを書いてみたいと思います。
実際にページネーション処理を行っているのは、
vendor/plugins/will_paginate/lib/will_paginate/finder.rb
になります。ここの


def paginate_by_sql(sql, options)
  WillPaginate::Collection.create(*wp_parse_options!(options)) do &#124;pager&#124;
    query = sanitize_sql(sql)
    options.update  ffset =&#62; pager.offset, :limit =&#62; pager.per_page

    original_query = query.dup
    add_limit! query, options
    # perfom the find
   [...]]]></description>
			<content:encoded><![CDATA[<p>Rails2.0からページネーションがプラグインベースになりました。普通のページネーションであれば、</p>
<blockquote><p>@memos = @user.memos.paginate(:page =&gt; params[:page], :per_page =&gt; 10, <img src='http://rails20.jp/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder=&gt;&#8221;memos.id DESC&#8221;)</p></blockquote>
<p>だけで使えるようになって便利ですが、任意の情報に対してページネーションする方法がいまいち分かっていませんでした。そして、acts_as_searchableを使って、HyperEstraierで全文検索を行う際に、ページネーションをどのように行えば良いのか調べつつ分かったところを書いてみたいと思います。</p>
<p>実際にページネーション処理を行っているのは、</p>
<p><strong>vendor/plugins/will_paginate/lib/will_paginate/finder.rb</strong></p>
<p>になります。ここの</p>
<blockquote>
<pre>
def paginate_by_sql(sql, options)
  WillPaginate::Collection.create(*wp_parse_options!(options)) do |pager|
    query = sanitize_sql(sql)
    options.update <img src='http://rails20.jp/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ffset =&gt; pager.offset, :limit =&gt; pager.per_page

    original_query = query.dup
    add_limit! query, options
    # perfom the find
    pager.replace find_by_sql(query)

    unless pager.total_entries
      count_query = original_query.sub /bORDERs+BYs+[w`,s]+$/mi, ''
      count_query = "SELECT COUNT(*) FROM (#{count_query}) AS count_table"
      # perform the count query
      pager.total_entries = count_by_sql(count_query)
    end
  end
end</pre>
</blockquote>
<p>が参考になります。</p>
<p>pager.replaceに、リストを入れて、pager.total_entriesに行数を入れればOKのようです。この処理をまねて、</p>
<p><strong>app/controllers/application.rb</strong></p>
<p>に次のように定義します。</p>
<blockquote>
<pre>
module WillPaginate
  module Finder
    module ClassMethods
      def paginate_by_fulltext_search(query, options)
        WillPaginate::Collection.create(*wp_parse_options!(options)) do |pager|
          pager.replace fulltext_search(query, options)

          count_options = Hash.new
          count_options[:count] = true
          count_options[:attributes] = options[:attributes] if options[:attributes]
          pager.total_entries = fulltext_search(query, count_options)
        end
      end
    end
  end
end</pre>
</blockquote>
<p>です。そして、呼び出し側では次のようにします。</p>
<blockquote><p>@memos = Memo.paginate_by_fulltext_search(params[:q], :attributes =&gt; &#8220;user_id NUMEQ %d&#8221; % @user.id, :limit =&gt; perpage, <img src='http://rails20.jp/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ffset =&gt; offset, :page =&gt; params[:page], :per_page =&gt; perpage)</p></blockquote>
<p>ここで、:limitはacts_as_searchable用、:per_pageはwill_paginate用になります。:pageや:offsetは共通で利用できるようです。:attributesはあれば設定します。これさえ設定しておけば、ビュー側は</p>
<blockquote><p>&lt;%= will_paginate @memos, :prev_label=&gt; _(&#8217;« Prev&#8217;), :next_label=&gt; _(&#8217;Next »&#8217;) %&gt;</p></blockquote>
<p>が利用できて便利です。ちなみにpaginate_by_sqlではoptionsがアップデートされるので、デフォルトの30件になってしまうようですね。これはなぜなんだろう…。</p>
]]></content:encoded>
			<wfw:commentRss>http://rails20.jp/2008/03/will_paginate-acts_as_searchable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
