<?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>ひげろぐ &#187; rails-plugin</title>
	<atom:link href="http://brass.to/blog/tag/rails-plugin/feed" rel="self" type="application/rss+xml" />
	<link>http://brass.to/blog</link>
	<description>技術者として仕事人としての思うところや覚え書きやらです</description>
	<lastBuildDate>Fri, 30 Jul 2010 10:07:43 +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>Rails2.0でauto_completeを使う</title>
		<link>http://brass.to/blog/rails_2_0_auto_complete.html</link>
		<comments>http://brass.to/blog/rails_2_0_auto_complete.html#comments</comments>
		<pubDate>Mon, 12 May 2008 11:48:20 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/rails_2_0_auto_complete_field.html</guid>
		<description><![CDATA[Railsにはもともとテキストフィールドにオートコンプリート機能を簡単に付けることのできる機構が用意されていたが、Rails2.0でこれを使おうとするといくつかつまずく点がある。
プラグインになっている
まずひとつめはページネーションなどと同じくRails2.0になって機能がプラグインに分離されたと言う点。    なのでプラグインをインストールする必要がある。
$ ruby script/plugin install auto_complete
CSRFプロテクションにブロックされる
次にRails2.0から付け加えられたCSRFプロテクションのためにこのまま使ってもエラーが出てしまうので、auto_completeプラグインのソースをいじってやる必要があるようだ。
  それには以下のページを参考になる。
Rails 2.0.2で、auto_completeを使うと、 &#8211; Invalid Token
これで従来と同じように使えるようになる。
  auto_completeの使い方自体は以下のページが詳しい。
検索可能なプルダウンリストを作る。 &#8211; ザリガニが見ていた&#8230;。 
ほかぐぐってもたくさん出てくるのでauto_completeに関してこれ以上の説明は割愛する。
]]></description>
			<content:encoded><![CDATA[<p>Railsにはもともとテキストフィールドにオートコンプリート機能を簡単に付けることのできる機構が用意されていたが、Rails2.0でこれを使おうとするといくつかつまずく点がある。</p>
<h4>プラグインになっている</h4>
<p>まずひとつめはページネーションなどと同じくRails2.0になって機能がプラグインに分離されたと言う点。    <br />なのでプラグインをインストールする必要がある。</p>
<pre><code>$ ruby script/plugin install auto_complete</code></pre>
<h4>CSRFプロテクションにブロックされる</h4>
<p>次にRails2.0から付け加えられたCSRFプロテクションのためにこのまま使ってもエラーが出てしまうので、auto_completeプラグインのソースをいじってやる必要があるようだ。<br />
  <br />それには以下のページを参考になる。</p>
<p><a href="http://d.hatena.ne.jp/jakei/20080305/1204764230" target="_blank">Rails 2.0.2で、auto_completeを使うと、 &#8211; Invalid Token</a></p>
<p>これで従来と同じように使えるようになる。<br />
  <br />auto_completeの使い方自体は以下のページが詳しい。</p>
<p><a href="http://d.hatena.ne.jp/zariganitosh/20071007/1191828678" target="_blank">検索可能なプルダウンリストを作る。 &#8211; ザリガニが見ていた&#8230;。</a> </p>
<p>ほかぐぐってもたくさん出てくるのでauto_completeに関してこれ以上の説明は割愛する。</p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/rails_2_0_auto_complete.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>acts_as_taggable_on_steroidsの使い方まとめ</title>
		<link>http://brass.to/blog/acts_as_taggable_on_steroids.html</link>
		<comments>http://brass.to/blog/acts_as_taggable_on_steroids.html#comments</comments>
		<pubDate>Sun, 20 Apr 2008 17:49:50 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/acts_as_taggable_on_steroids.html</guid>
		<description><![CDATA[モデルにタグ付けの機能がつくacts_as_taggableの機能追加版であるacts_as_taggable_on_steroidsの使い方を整理してみた。

導入
モデルにタグ機能をつける &#8211; acts_as_taggable
モデルオブジェクトへのタグ付けと参照 &#8211; tag_list
タグの付いているモデルオブジェクトを取得する &#8211; find_tagged_with
タグの集計リストを取得する &#8211; tag_counts
タグクラウド &#8211; tag_cloud
タグのデリミタを変更する &#8211; TagList.delimiter
タグのキャッシュと使われなくなったタグの削除

導入
プラグインをインストールしてマイグレーションでデータベースの準備。
プラグインのインストール
$ ruby script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids
データベースの準備
$ ruby script/generate acts_as_taggable_migration
これでマイグレーション用のファイルができるのでマイグレーション。
$ rake db:migrate
導入は以上。
モデルにタグ機能をつける &#8211; acts_as_taggable
モデルに「acts_as_taggable」と一行追加。
class Item < ActiveRecord::Base
  acts_as_taggable
end
これでそのモデルのオブジェクトにタグ付けできるようになる。
モデルオブジェクトへのタグ付けと参照 &#8211; tag_list
tag_listを介してタグ付けと付けたタグの参照ができる。
タグ付け
tag_listにタグのリストを代入するとモデルオブジェクトにタグが付く。
モデルオブジェクトをsaveするとタグも保存される。
item.tag_list = "テント, 設営器具, ペグ"
# =&#62; ["テント", "設営器具", "ペグ"]
# item.tag_list = ["テント, "設営器具", "ペグ"] でもよい
item.save
以下タグのリストに関する仕様。

タグのリストは配列でも文字列でも文字列で指定する
文字列で指定した場合のデリミタのデフォルトはコンマ
重複タグは自動的にユニークになる
タグの前後の空白は取り除かれる
空タグ（nilや空文字列）は取り除かれる

タグの参照
付けたタグはtag_listで参照できる。返値は配列。
item.tag_list
# =&#62; ["テント", "設営器具", "ペグ"]
文字列で欲しい場合はto_s。デリミタで区切られた文字列で返される。
item.tag_list.to_s
# =&#62; "テント, 設営器具, ペグ"
デリミタが半角スペース以外の時にはデリミタとタグの間に半角スペースが入った形になる。
タグリストの変更 &#8211; add, [...]]]></description>
			<content:encoded><![CDATA[<p>モデルにタグ付けの機能がつくacts_as_taggableの機能追加版であるacts_as_taggable_on_steroidsの使い方を整理してみた。</p>
<ul>
<li>導入</li>
<li>モデルにタグ機能をつける &#8211; acts_as_taggable</li>
<li>モデルオブジェクトへのタグ付けと参照 &#8211; tag_list</li>
<li>タグの付いているモデルオブジェクトを取得する &#8211; find_tagged_with</li>
<li>タグの集計リストを取得する &#8211; tag_counts</li>
<li>タグクラウド &#8211; tag_cloud</li>
<li>タグのデリミタを変更する &#8211; TagList.delimiter</li>
<li>タグのキャッシュと使われなくなったタグの削除</li>
</ul>
<h4>導入</h4>
<p>プラグインをインストールしてマイグレーションでデータベースの準備。</p>
<h5>プラグインのインストール</h5>
<pre><code>$ ruby script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids</code></pre>
<h5>データベースの準備</h5>
<pre><code>$ ruby script/generate acts_as_taggable_migration</code></pre>
<p>これでマイグレーション用のファイルができるのでマイグレーション。</p>
<pre><code>$ rake db:migrate</code></pre>
<p>導入は以上。</p>
<h4>モデルにタグ機能をつける &#8211; acts_as_taggable</h4>
<p>モデルに「acts_as_taggable」と一行追加。</p>
<pre><code>class Item < ActiveRecord::Base
  acts_as_taggable
end</code></code></pre>
<p>これでそのモデルのオブジェクトにタグ付けできるようになる。</p>
<h4>モデルオブジェクトへのタグ付けと参照 &#8211; tag_list</h4>
<p>tag_listを介してタグ付けと付けたタグの参照ができる。</p>
<h5>タグ付け</h5>
<p>tag_listにタグのリストを代入するとモデルオブジェクトにタグが付く。<br />
モデルオブジェクトをsaveするとタグも保存される。</p>
<pre><code>item.tag_list = "テント, 設営器具, ペグ"
# =&gt; ["テント", "設営器具", "ペグ"]
# item.tag_list = ["テント, "設営器具", "ペグ"] でもよい
item.save</code></pre>
<p>以下タグのリストに関する仕様。</p>
<ul>
<li>タグのリストは<s>配列でも文字列でも</s>文字列で指定する</li>
<li>文字列で指定した場合のデリミタのデフォルトはコンマ</li>
<li>重複タグは自動的にユニークになる</li>
<li>タグの前後の空白は取り除かれる</li>
<li>空タグ（nilや空文字列）は取り除かれる</li>
</ul>
<h5>タグの参照</h5>
<p>付けたタグはtag_listで参照できる。返値は配列。</p>
<pre><code>item.tag_list
# =&gt; ["テント", "設営器具", "ペグ"]</code></pre>
<p>文字列で欲しい場合はto_s。デリミタで区切られた文字列で返される。</p>
<pre><code>item.tag_list.to_s
# =&gt; "テント, 設営器具, ペグ"</code></pre>
<p>デリミタが半角スペース以外の時にはデリミタとタグの間に半角スペースが入った形になる。</p>
<h5>タグリストの変更 &#8211; add, remove, toggle</h5>
<p>タグリストへの追加や削除を行うためのメソッドが用意されている。<br />
モデルオブジェクトにすでにタグが付いているときなど、既存のタグリストに対して簡単にタグの追加や削除を行ったりすることができるので便利。</p>
<p>tag_list.addで追加。</p>
<pre><code>item.tag_list.add("Coleman, コールマン")
# =&gt; ["テント", "設営器具", "ペグ", "Coleman", "コールマン"]</code></pre>
<p>tag_list.removeで削除。<br />
指定したタグがタグのリストの中に存在していなくてもエラーにはならない。</p>
<pre><code>item.tag_list.remove("Coleman, コールマン")
# =&gt; ["テント", "設営器具", "ペグ"]</code></pre>
<p>tag_list.toggleでトグルなんてこともできる。</p>
<pre><code>item.tag_list.toggle("スチール製")
# =&gt; ["テント", "設営器具", "ペグ", "スチール製"]

item.tag_list.toggle("スチール製")
# =&gt; ["テント", "設営器具", "ペグ"]</code></pre>
<h4>タグの付いているモデルオブジェクトを取得する &#8211; find_tagged_with</h4>
<p>find_tagged_withを使うと付いているタグからレコードを取得できる。<br />
引数にはタグを指定する。</p>
<pre><code>items = Item.find_tagged_with("テント")
# =&gt; 「テント」のタグが付いているレコードを取得</code></pre>
<p>find_tagged_withには通常のfindと同じく:conditions、:order、:limitなどを設定することが可能。</p>
<pre><code>items = Item.find_tagged_with("テント", :conditions =&gt; ["maker_id = 1"], :order => 'price', :limit => 20)</code></pre>
<h5>複数のタグを指定してレコードを取得</h5>
<p>複数のタグを指定すると、デフォルトではそれらタグのどれかがついているレコードを取得する。<br />
つまりOR条件での取得になる。</p>
<pre><code>items = Item.find_tagged_with("テント, タープ")
# =&gt; 「テント」もしくは「タープ」のいずれかのタグを持つレコードを取得</code></pre>
<p>AND条件っぽく取得したい場合はオプションで「:match_all =&gt; true」を指定する。<br />
すると指定されたタグがすべて付いているレコードのみ取得する。</p>
<pre><code>items = Item.find_tagged_with("テント, 本体", :match_all =&gt; true)
# =&gt; 「テント」でかつ「本体」両方のタグを持つレコードを取得</code></pre>
<h5>ページネーション</h5>
<p>取得したデータのページネーションはwill_paginateを使っていると簡単。<br />
find_tagged_withに続けてpaginateを使う。</p>
<p>コントローラには次のように書く。:conditionsや:orderなどはfind_tagged_withの方に含める。</p>
<pre><code>@items = Item.find_tagged_with('テント', :order => :price).paginate(:page =&gt; params[:page], :per_page => 20)</code></pre>
<p>ビューで次のように書く。</p>
<pre><code>&lt;%= will_paginate(@items) %&gt;</code></pre>
<p>参考：<a href="http://brass.to/blog/will_paginate.html" target="_blank">will_paginateに移行 &#8211; ひげろぐ</a></p>
<p>コントローラではpaginate_tagged_withというメソッドを使ってもいいのだがその場合は「:match_all => true」とあわせて使うことができないようだ。</p>
<pre><code>@items = Item.paginate_tagged_with('テント', :page =&gt; params[:page], :order => :price, :per_page => 20)</code></pre>
<h4>タグの集計リストを取得する &#8211; tag_counts</h4>
<p>タグクラウドのようなタグの一覧を作ったりするためにタグの使用回数が集計されたリストを取得することができる。</p>
<h5>すべてのタグを取得</h5>
<p>Tag.countsですべてのタグの集計を取得できる。</p>
<p>返値はTagモデルオブジェクトの配列。<br />
個別のタグにはタグ名と使われている回数の情報が含まれており、それらはTagモデルのオブジェクトのメソッドで取得できる。</p>
<table>
<tr>
<th>name</th>
<td>タグ名</td>
</tr>
<tr>
<th>count</th>
<td>タグの使われている回数</td>
</tr>
</table>
<pre><code>tags = Tag.counts
p "#{tags.first.name}(#{tags.first.count})"
# =&gt; テント(123)</code></pre>
<p>複数のモデルにタグ機能を付けている場合はすべてのモデルに付いているタグが全部出てくる。<br />
なのでこの取得の仕方はあまりしない方がいいだろう。</p>
<p>複数のモデルをまたいでタグの集計リストを取得するという明確な意図がある場合は別だが。</p>
<h5>あるモデルのレコードに付けられているすべてのタグを取得</h5>
<p>モデルのクラスメソッドでtag_countsというメソッドが使えるようになっているのでこれを使う。<br />
そのモデルに付いているタグのみを取得するという以外はTag.countsと同じ。</p>
<pre><code>tags = Item.tag_counts
p "#{tags.first.name}(#{tags.first.count})"
# =&gt; テント(123)</code></pre>
<h5>tag_countsのオプション</h5>
<p>tag_countsにはいろいろオプションがある。</p>
<table>
<tr>
<th>:start_at</th>
<td>タグ付けされた日時が指定した日時以降のタグのみ対象に取得</td>
</tr>
<tr>
<th>:end_at</th>
<td>タグ付けされた日時が指定した日時以前のタグのみ対象に取得</td>
</tr>
<tr>
<th>:conditions</th>
<td>findと同じようにwhere条件を指定。モデルのカラムの他、tags.nameやtaggings.created_atなどのカラムも条件に含めることができる。</td>
</tr>
<tr>
<th>:limit</th>
<td>取得件数の制限。findで指定するのと同じ。</td>
</tr>
<tr>
<th>:order</th>
<td>ソート条件の指定。findで指定するのと同じ。</td>
</tr>
<tr>
<th>:at_least</th>
<td>タグのついているレコード数が指定した数値以上のタグのみを対象に取得</td>
</tr>
<tr>
<th>:at_most</th>
<td>タグのついているレコード数が指定した数値以下のタグのみを対象に取得</td>
</tr>
</table>
<p>これらを使うことでいろいろな条件で集計が可能。<br />
タグごとにタグ付けされた日時が保存されているので例えば月間ごとにタグクラウドを出したりとかそんなこともできる。</p>
<h5>関連と一緒に使う</h5>
<p>こともできる。</p>
<pre><code>Category.find_by_name('テント・タープ').items.tag_counts</code></pre>
<p>楽でよろしい。</p>
<h4>タグクラウド &#8211; tag_cloud</h4>
<p>用意されているtag_cloudヘルパーを使うことでタグクラウドを簡単に作ることができる。<br />
tag_cloudヘルパーはTagsHelperをインクルードすると使用可能となる。</p>
<p>tag_cloudヘルパーの引数にはTag.countsの返値とCSSクラスの配列を与え、ブロックを渡す。</p>
<p>サンプルで説明するとまずヘルパーをインクルードして</p>
<pre><code>module ApplicationHelper
  include TagsHelper
end</code></pre>
<p>ビューで次のように使う。</p>
<pre><code>&lt;% @tags = Item.tag_counts %&gt;
&lt;% tag_cloud(@tags, ['tag-x-small', 'tag-small', 'tag-medium', 'tag-large', 'tag-x-large']) do |tag, css_class| %&gt;
  &lt;%= link_to(tag.name, { :action =&gt; :tag, :id => tag.name }, :class => css_class) %&gt;
&lt;% end %&gt;</code></pre>
<p>対応するCSSは以下。</p>
<pre><code>.tag-x-small { font-size:  80%; }
.tag-small   { font-size:  90%; }
.tag-medium  { font-size: 100%; }
.tag-large   { font-size: 120%; }
.tag-x-large { font-size: 150%; }</code></pre>
<p>「@tags = Item.tag_counts」の箇所は実際にはコントローラ内に書くと思うがサンプルと言うことでひとつ。<br />
CSSクラスの数は任意に変更でき大きさの段階を細かくしたい場合には増やせば、粗くしたい場合は減らせばよい。</p>
<h4>タグのデリミタの変更 &#8211; TagList.delimiter</h4>
<p>TagList.delimiterの値を変更することでタグのデリミタを変更できる。</p>
<p>半角スペースにしたい場合は次のように。</p>
<pre><code>TagList.delimiter = " "</code></pre>
<p>デリミタはいつでも変更できるが基本的に使っている途中で別のものに変更するとかは考えにくいのでconfig/environment.rbに書くのが普通だろう。</p>
<h4>タグのキャッシュと使われなくなったタグの削除</h4>
<p>パフォーマンスなどに関わるデータベース周りの話。</p>
<h5>タグリストのキャッシュ</h5>
<p>タグをモデルのテーブルに文字列としてキャッシュすることができる。<br />
モデルについているタグを参照するときにタグテーブルにアクセスしにいかなくなるのでパフォーマンス的に助かる。</p>
<p>このキャッシュと使うためには単に「cached_tag_list」という文字列型のカラムをモデルのテーブルに作ればよい。</p>
<p>例えば以下のようなマイグレーションで。<br />
ひとつのオブジェクトにつくタグの数が多い場合はカラムのサイズに注意すること。</p>
<pre><code>class CacheItemTagList < ActiveRecord::Migration
  def self.up
    add_column :items, :cached_tag_list, :string
  end
end</code></code></pre>
<p>カラムがあれば自動的にキャッシュされるようになる。<br />
タグリストを変更した場合にはキャッシュの内容も自動的に変更されるので、キャッシュを使っていると意識する必要はまずない。</p>
<p>何らかの事情でカラムの名前を変えたければset_cached_tag_list_column_nameを使う。</p>
<pre><code>class Item < ActiveRecord::Base
  acts_as_taggable

  set_cached_tag_list_column_name "tags_cache"
end</code></code></pre>
<p>カラムが存在しなくてもエラーにはならない。<br />
なければキャッシュが働かないと言うだけ。</p>
<h5>使われなくなったタグを自動的に削除する</h5>
<p>いったん作られたタグはモデルオブジェクトのタグリストから削除されて、まったく使われなくなってもtagsテーブルに残り続ける。<br />
これが目障りなら以下のコードをどこかに書いておけば使われなくなったタグは自動的に削除される。</p>
<pre><code>Tag.destroy_unused = true</code></pre>
<p>config/environment.rb辺りに書いておけばよいと思う。<br />
この削除はタグリストから削除されたタイミングで行われるので、destroy_unusedをtrueにする前に使われなくなったタグはやっぱりそのまま残り続ける。</p>
<p>まあパフォーマンスに影響が出ているとか何らかの問題がなければ残りっぱなしでほっといてもかまわんと思う。</p>
<h4>参考</h4>
<ul>
<li><a href="http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids" target="_blank">Plugins &#8211; Acts As Taggable On Steroids &#8211; Agile Web Development</a></li>
<li><a href="http://blog.tkmr.org/tatsuya/show/306-rails-plugin-acts-as-taggable" target="_blank">Rails Pluginのacts_as_taggableが機能追加されてる:TKMR.blog.show</a></li>
<li><a href="http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids/README" target="_blank">acts_as_taggable_on_steroids/README</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/acts_as_taggable_on_steroids.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>BackgrounDRbでワーカーの自動起動を制御するメソッド</title>
		<link>http://brass.to/blog/backgroundrb_set_no_auto_load.html</link>
		<comments>http://brass.to/blog/backgroundrb_set_no_auto_load.html#comments</comments>
		<pubDate>Fri, 11 Apr 2008 13:57:21 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[BackgrounDrb]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/backgroundrb_set_no_auto_load.html</guid>
		<description><![CDATA[set_no_auto_load
ワーカーを作ってBackgrounDRbサーバを起動すると基本的にワーカーが自動的に起動して待機した状態になる。
必要がないのにずっとアイドリングしているのはリソースの無駄だ。
あるいは開発中のワーカーが勝手に起動してしまうのは邪魔だ。
そんなことが気になる場合にはワーカーのコード内でset_no_auto_loadを引数trueで呼び出す。
するとワーカーが勝手に起動しない。
class FooWorker < BackgrounDRb::MetaWorker
  set_worker_name :foo_worker
  set_no_auto_load true

  ...
これをtrueにしたりfalseにしたりしつつ、script/consoleなどから
MiddleMan.all_worker_info
で確認するとワーカーが起動していたりしていなかったりする様が確認できる。
ちなみに手動で新しいワーカーを起動するには以下のコードで。
MiddleMan.new_worker(:worker => :foo_worker)
new_workerの返値はworkerじゃないので注意。
起動したworkerを取得するにはMiddleMan.workerを使わないといけない。
参考

BackgrounDRb &#8211; Using BackgrounDRb workers

]]></description>
			<content:encoded><![CDATA[<h4>set_no_auto_load</h4>
<p>ワーカーを作ってBackgrounDRbサーバを起動すると基本的にワーカーが自動的に起動して待機した状態になる。</p>
<p>必要がないのにずっとアイドリングしているのはリソースの無駄だ。<br />
あるいは開発中のワーカーが勝手に起動してしまうのは邪魔だ。</p>
<p>そんなことが気になる場合にはワーカーのコード内でset_no_auto_loadを引数trueで呼び出す。<br />
するとワーカーが勝手に起動しない。</p>
<pre><code>class FooWorker < BackgrounDRb::MetaWorker
  set_worker_name :foo_worker
  set_no_auto_load true

  ...</code></code></pre>
<p>これをtrueにしたりfalseにしたりしつつ、script/consoleなどから</p>
<pre><code>MiddleMan.all_worker_info</code></pre>
<p>で確認するとワーカーが起動していたりしていなかったりする様が確認できる。</p>
<p>ちなみに手動で新しいワーカーを起動するには以下のコードで。</p>
<pre><code>MiddleMan.new_worker(:worker => :foo_worker)</code></pre>
<p>new_workerの返値はworkerじゃないので注意。<br />
起動したworkerを取得するにはMiddleMan.workerを使わないといけない。</p>
<h4>参考</h4>
<ul>
<li><a href="http://backgroundrb.rubyforge.org/workers/index.html" target="_blank">BackgrounDRb &#8211; Using BackgrounDRb workers</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/backgroundrb_set_no_auto_load.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BackgrounDRbのちょっとイマイチと思うところ</title>
		<link>http://brass.to/blog/little_lacks_of_backgroundrb.html</link>
		<comments>http://brass.to/blog/little_lacks_of_backgroundrb.html#comments</comments>
		<pubDate>Tue, 08 Apr 2008 12:57:35 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[BackgrounDrb]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/little_lacks_of_backgroundrb.html</guid>
		<description><![CDATA[最近しばらく使っててイマイチと思ったところ。
開発時にサーバー再起動がめんどい
ワーカーのコード書き換えるたびにサーバー再起動しないといけないのでめんどい。
まあ開発の大部分はサーバーを動かさずにメソッドごとのユニットテストで仕上げていくので、めんどいのは最後の仕上げとか動作確認しつつの調整の時くらいなんだけど。
そんくらい我慢しやがれですか。そうですか。
しかしせめてrestartが欲しい。
自分で書きやがれですか。そうですか。
なんでBackgrounDRbのサーバーすぐ死んでしまうん？
MiddleMan.workerの引数を間違えてハッシュで与えたりとかして取得したワーカーで何かしようとするとあっさり死ぬ。
ワーカーが死ぬんじゃなくてBackgrounDRbサーバーが死ぬ。
例えば以下のコードで瞬殺。
worker = MiddleMan.worker(:worker => :hoge_worker)
worker.ask_status
これでエラー吐いて死亡。
ちなみにワーカー取得の正しいコードは
worker = MiddleMan.worker(:hoge_worker)
単に間違えるなって話ですか。
でも死んでしまうのはちょっとショックというか不安感をあおるなぁ。
あとサーバー再起動したときに再起動前に取得したワーカーを使っても同じように死亡。
サーバー再起動のタイミングとか環境によっては気を遣わないとだめっぽいですな。
もうちょっと不測の事態に強くなって欲しい。
さすがにワーカーのコードで何かエラーが起きただけで死んだりすることはないけど。
しかしながら
とまあこういった不満はちょっとあるけど、大旨は問題なく使ってます。
さらにバージョンが上がって練り上がってくるのが楽しみ。
]]></description>
			<content:encoded><![CDATA[<p>最近しばらく使っててイマイチと思ったところ。</p>
<h4>開発時にサーバー再起動がめんどい</h4>
<p>ワーカーのコード書き換えるたびにサーバー再起動しないといけないのでめんどい。</p>
<p>まあ開発の大部分はサーバーを動かさずにメソッドごとのユニットテストで仕上げていくので、めんどいのは最後の仕上げとか動作確認しつつの調整の時くらいなんだけど。<br />
そんくらい我慢しやがれですか。そうですか。</p>
<p>しかしせめてrestartが欲しい。<br />
自分で書きやがれですか。そうですか。</p>
<h4>なんでBackgrounDRbのサーバーすぐ死んでしまうん？</h4>
<p>MiddleMan.workerの引数を間違えてハッシュで与えたりとかして取得したワーカーで何かしようとするとあっさり死ぬ。<br />
ワーカーが死ぬんじゃなくてBackgrounDRbサーバーが死ぬ。</p>
<p>例えば以下のコードで瞬殺。</p>
<pre><code>worker = MiddleMan.worker(:worker => :hoge_worker)
worker.ask_status</code></pre>
<p>これでエラー吐いて死亡。<br />
ちなみにワーカー取得の正しいコードは</p>
<pre><code>worker = MiddleMan.worker(:hoge_worker)</code></pre>
<p>単に間違えるなって話ですか。<br />
でも死んでしまうのはちょっとショックというか不安感をあおるなぁ。</p>
<p>あとサーバー再起動したときに再起動前に取得したワーカーを使っても同じように死亡。<br />
サーバー再起動のタイミングとか環境によっては気を遣わないとだめっぽいですな。</p>
<p>もうちょっと不測の事態に強くなって欲しい。<br />
さすがにワーカーのコードで何かエラーが起きただけで死んだりすることはないけど。</p>
<h4>しかしながら</h4>
<p>とまあこういった不満はちょっとあるけど、大旨は問題なく使ってます。<br />
さらにバージョンが上がって練り上がってくるのが楽しみ。</p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/little_lacks_of_backgroundrb.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BackgrounDRbによるタスクのスケジューリング方法まとめ</title>
		<link>http://brass.to/blog/backgroundrb_scheduling.html</link>
		<comments>http://brass.to/blog/backgroundrb_scheduling.html#comments</comments>
		<pubDate>Sun, 06 Apr 2008 07:58:13 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[BackgrounDrb]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/backgroundrb_scheduling.html</guid>
		<description><![CDATA[
2010年5月追記 今使うならdelayed_jobとかResqueとかがいいっぽいです。今動いてるものはまだしも今から作るものでBackgrounDrbはやめた方がたぶん幸せになれます。

BackgrounDRbのスケジューリング方法いろいろいじってみたのでそのまとめ。
以下の三種類がある。

タイマーによるスケジューラ
Cronスタイルのスケジューラ
Unixスタイルのスケジューラ

タイマーによるスケジューラ
ワーカーのコードに書くタイプのスケジューラ。
ワーカーのメソッドでタイマーを設定できる。


メソッド
説明


add_timer(n)
与えたブロックをn秒後に1回だけ実行


add_periodic_timer(n)
与えたブロックをn秒ごとに実行


createでadd_periodic_timerを呼び出せば定期的に繰り返すバッチ処理などを行うことが可能。
コードに書くだけで設定できるのでお手軽と言えばお手軽。
add_timerは1回だけ実行される。
create以外の場所でも使うことができるので、何らかのタスクを行った一定時間後に後始末処理を行うとかいった使い方ができそう。
サンプルコード &#8211; lib/workers/foo_worker.rb
タイマーでログにタスク実行の日時を書き込むだけのサンプル。
class FooWorker < BackgrounDRb::MetaWorker
  set_worker_name :foo_worker
  def create(args = nil)
    add_timer(10) do
      logger.info "#{Time.now} - oneshot"
    end

    add_periodic_timer(1) do
      hello("#{Time.now} - repeated")
    end
  end

  def hello(message)
 [...]]]></description>
			<content:encoded><![CDATA[<div class="notice">
2010年5月追記 今使うなら<a href="http://github.com/tobi/delayed_job">delayed_job</a>とか<a href="http://github.com/defunkt/resque">Resque</a>とかがいいっぽいです。今動いてるものはまだしも今から作るものでBackgrounDrbはやめた方がたぶん幸せになれます。
</div>
<p>BackgrounDRbのスケジューリング方法いろいろいじってみたのでそのまとめ。</p>
<p>以下の三種類がある。</p>
<ul>
<li>タイマーによるスケジューラ</li>
<li>Cronスタイルのスケジューラ</li>
<li>Unixスタイルのスケジューラ</li>
</ul>
<h4>タイマーによるスケジューラ</h4>
<p>ワーカーのコードに書くタイプのスケジューラ。<br />
ワーカーのメソッドでタイマーを設定できる。</p>
<table>
<tr>
<th>メソッド</th>
<th>説明</th>
</tr>
<tr>
<td>add_timer(n)</td>
<td>与えたブロックをn秒後に1回だけ実行</td>
</tr>
<tr>
<td>add_periodic_timer(n)</td>
<td>与えたブロックをn秒ごとに実行</td>
</tr>
</table>
<p>createでadd_periodic_timerを呼び出せば定期的に繰り返すバッチ処理などを行うことが可能。<br />
コードに書くだけで設定できるのでお手軽と言えばお手軽。</p>
<p>add_timerは1回だけ実行される。<br />
create以外の場所でも使うことができるので、何らかのタスクを行った一定時間後に後始末処理を行うとかいった使い方ができそう。</p>
<h5>サンプルコード &#8211; lib/workers/foo_worker.rb</h5>
<p>タイマーでログにタスク実行の日時を書き込むだけのサンプル。</p>
<pre><code>class FooWorker < BackgrounDRb::MetaWorker
  set_worker_name :foo_worker
  def create(args = nil)
    add_timer(10) do
      logger.info "#{Time.now} - oneshot"
    end

    add_periodic_timer(1) do
      hello("#{Time.now} - repeated")
    end
  end

  def hello(message)
    logger.info message
  end
end</code></code></pre>
<h4>Cronスタイルのスケジューラ</h4>
<p>設定ファイルであるconfig/backgroundrb.ymlに設定を書くタイプのスケジューラ。<br />
crontabに書く形式でスケジュールを指定できる。</p>
<p>「:schedules:」というセクションを設定ファイルに追加して定義する。<br />
具体的にどう書くかは言葉での説明がしんどいのでサンプルコード参照。</p>
<h5>サンプルコード &#8211; config/backgroundrb.yml</h5>
<pre><code>:backgroundrb:
  :port: 11006
  :ip: 0.0.0.0 

:schedules:
  :foo_worker:
    :hello:
      :trigger_args: 0 0 8 * * *
      :data: Hello from a cron style scheduler
    :good_night:
      :trigger_args: 0 0 22 * * *
      :data: Good night from a cron style scheduler at 22:00
    :good_night:
      :trigger_args: 0 0 20 * * *
      :data: Good night from a cron style scheduler at 20:00</code></pre>
<p>ワーカー、タスク（メソッド）は複数書くことができる。<br />
ただし同じタスクに関するスケジュール設定を複数書くことはできず、複数書くとエラーにはならないが一番最後に定義されたものだけが有効になる。<br />
上の例だとgood_nightは20時タスクに実行される。</p>
<p>「:trigger_args:」にcrontabと同じ形でスケジュールを指定。<br />
「:data:」はそのまま文字列としてタスクの引数になる。</p>
<h4>Unixスタイルのスケジューラ</h4>
<p>個人的にいまいちなじみがないけどUnixスタイルのスケジューラもある。<br />
Cronスタイルのスケジューラと同じようにスケジューリングの設定をconfig/backgroundrb.ymlに書く。<br />
設定ファイルにCronスタイルとUnixスタイルの書き方を共存させても問題はない。</p>
<pre><code>:backgroundrb:
  :port: 11006
  :ip: 0.0.0.0 

:schedules:
  :foo_worker:
    :hello:
      :trigger_args:
        :start: &lt;%= Time.now + 1.second %&gt;
        :end: &lt;%= Time.now + 10.minutes %&gt;
        :repeat_interval: &lt;%= 3.seconds %&gt;
      :data: Hello from a unix style scheduler</code></pre>
<p>「:start:」の時間が来ると繰り返しがスタートし「:repeat_interval:」ごとに実行される。<br />
「:end:」の時間が来ると繰り返しは終了。<br />
「:start:」と「:end:」の間の時間よりも「:repeat_interval:」が長いとタスクは一度も実行されずに繰り返しは終了する。</p>
<p>スケジュールの書き方の他はCronスタイルのスケジューラと同じ。</p>
<h4>参考</h4>
<ul>
<li><a href="http://backgroundrb.rubyforge.org/scheduling/index.html" target="_blank">BackgrounDRb &#8211; Scheduling Tasks using BackgrounDRb</a></li>
</ul>
<h6>近況</h6>
<p>しばらくバイクで放浪してました。明石焼きとか赤福とか食ってきました。<br />
それにしても天気予報でエイプリルフールとか勘弁していだだきたい。しかも自分の走ってた地域だけピンポイントでとか。</p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/backgroundrb_scheduling.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HasFinderというRails pluginが激しく便利</title>
		<link>http://brass.to/blog/has_finder.html</link>
		<comments>http://brass.to/blog/has_finder.html#comments</comments>
		<pubDate>Sun, 30 Mar 2008 11:09:48 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/has_finder.html</guid>
		<description><![CDATA[nick &#8211; HasFinder &#8212; It&#8217;s Now Easier than ever to create complex, re-usable SQL queries
一言で説明すると「いろいろな条件のFindをモデルのメソッドにして便利に利用できる」というもの。
導入
とりあえずは入れて使う方法から。
$ sudo gem install has_finder
environment.rbに以下追記。
gem 'has_finder'
require 'has_finder'
使ってみる
早速メソッド作ってみる。
class Item < ActiveRecord::Base
  has_finder :stocked, :conditions => [&#34;stock > 0&#34;]
  has_finder :has_image, :conditions => {:has_image => true}
end
これだけなら別に普通にメソッド定義できるものをちょっと簡単に書けるようにしただけのことでフーンってかんじ。
だがこれらのメソッドをいろいろと組み合わせて柔軟に使っていけるところがHasFinderの真骨頂。
手始めとしてメソッドを連結して使ったりとか。
items = Item.stocked.has_image
絞り込み条件がいいかんじにDRYに。
この後にさらにfindで絞り込んだり並べ替えたりも可能。集計関数も行ける。
items = Item.stocked.has_image.find(:all, :conditions => [&#34;maker_id = ?&#34;, params[:maker_id]], :order => 'price')
items = Item.stocked.has_image.count
関連といっしょに使っても問題なし。
class [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://pivots.pivotallabs.com/users/nick/blog/articles/284-hasfinder-it-s-now-easier-than-ever-to-create-complex-re-usable-sql-queries" target="_blank">nick &#8211; HasFinder &#8212; It&#8217;s Now Easier than ever to create complex, re-usable SQL queries</a></p>
<p>一言で説明すると「いろいろな条件のFindをモデルのメソッドにして便利に利用できる」というもの。</p>
<h4>導入</h4>
<p>とりあえずは入れて使う方法から。</p>
<pre><code>$ sudo gem install has_finder</code></pre>
<p>environment.rbに以下追記。</p>
<pre><code>gem 'has_finder'
require 'has_finder'</code></pre>
<h4>使ってみる</h4>
<p>早速メソッド作ってみる。</p>
<pre><code>class Item < ActiveRecord::Base
  has_finder :stocked, :conditions => [&quot;stock > 0&quot;]
  has_finder :has_image, :conditions => {:has_image => true}
end</code></pre>
<p>これだけなら別に普通にメソッド定義できるものをちょっと簡単に書けるようにしただけのことでフーンってかんじ。<br />
だがこれらのメソッドをいろいろと組み合わせて柔軟に使っていけるところがHasFinderの真骨頂。</p>
<p>手始めとしてメソッドを連結して使ったりとか。</p>
<pre><code>items = Item.stocked.has_image</code></pre>
<p>絞り込み条件がいいかんじにDRYに。<br />
この後にさらにfindで絞り込んだり並べ替えたりも可能。集計関数も行ける。</p>
<pre><code>items = Item.stocked.has_image.find(:all, :conditions => [&quot;maker_id = ?&quot;, params[:maker_id]], :order => 'price')
items = Item.stocked.has_image.count</code></pre>
<p>関連といっしょに使っても問題なし。</p>
<pre><code>class Category < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  has_one :category
  has_finder :stocked, :conditions => [&quot;stock > 0&quot;]
  has_finder :has_image, :conditions => {has_image => true}
end

category.items.stocked</code></pre>
<p>ページネーションもおｋ。</p>
<pre><code>items = Item.stocked.paginate(:page => params[:page], :conditions => [&quot;category_id = ?&quot;, @category.id], :order => 'name', :per_page => 20)</code></pre>
<p>メソッドに引数を取って条件の値の指定を動的に行うこともできる。</p>
<pre><code>class Item < ActiveRecord::Base
  has_finder :price_under, lambda {|price| { :conditions => [&quot;price < = ?&quot; , price] } }
end

items = Item.price_under(10000)</code></code></pre>
<p>ほかAssociation extentionsみたいなこともできる。</p>
<h4>もうすぐ標準</h4>
<p>RailsのEdgeでは本体に取り込まれている模様。</p>
<p><a href="http://ryandaigle.com/articles/2008/3/24/what-s-new-in-edge-rails-has-finder-functionality" target="_blank">Ryan&#8217;s Scraps: What&#8217;s New in Edge Rails: Has Finder Functionality</a></p>
<p>has_finderではなくnamed_scopeで定義するようになってたり若干変わってるようだけど、もうすぐ標準で使えるようになるみたいですな。</p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/has_finder.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>BackgounDRbでRailsの非同期処理とかバッチ処理とか</title>
		<link>http://brass.to/blog/backgroundrb.html</link>
		<comments>http://brass.to/blog/backgroundrb.html#comments</comments>
		<pubDate>Sat, 22 Mar 2008 12:19:02 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[BackgrounDrb]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/backgroundrb.html</guid>
		<description><![CDATA[
2010年5月追記 今使うならdelayed_jobとかResqueとかがいいっぽいです。今動いてるものはまだしも今から作るものでBackgrounDrbはやめた方がたぶん幸せになれます。

BackgrounDRbは名前の通りバックグラウンドでの処理に便利なプラグイン。
2007年の末に1.0がリリースされていた。
現在のバージョンは1.0.3になっている。
BackgrounDRbを使うとバックグラウンドの処理をコントローラからキックしてスタートさせたり、BackgrounDRbの持つスケジューリング機能によって実行することができる。
つまり時間のかかる非同期処理やバッチ処理に使うことができる。
ロギングやステータス確認の仕組みも整っていて、バックグラウンド処理のフレームワークとしてなかなかいいかんじになっている。
1.0になって以前のバージョンとは互換性がなくなっている部分もあるので、アップグレードするには若干コードの修正が必要になるかもしれない。
またWindows上のサーバで使えなくなっているようだ。（対応の予定はあるそうだ）
以下にインストールから軽く使うまでをまとめてみた。
インストール
BackgrounDRbはchronicとpacketというgemに依存しているのでRailsのプラグインとして入れる前にそれらを入れる必要がある。
$ sudo gem install chronic packet
BackgrounDRbのインストールは次のコマンドで。
$ ruby script/plugin install http://svn.devjavu.com/backgroundrb/trunk
ちなみに古いバージョンが入っている場合は事前に消しておいた方がいい。
セットアップ
使い始める前に rake backgroundrb:setup でセットアップが必要。
rakeコマンドでセットアップすると必要なファイルやスクリプトがRAILS_ROOT以下に配置される。
$ rake backgroundrb:setup
(in /var/www/bgrb_sample)
Copying backgroundrb.yml config file to /var/www/bgrb_sample/config/backgroundrb.yml
Copying backgroundrb script to /var/www/bgrb_sample/script/backgroundrb
Creating /var/www/bgrb_sample/lib/workers
Copying Worker Test helper file /var/www/bgrb_sample/test/bdrb_test_helper.rb
古いバージョンを入れていた場合はこれらのファイルも消すか待避させておく必要がある。
特にbackgroundrb.ymlとscript/backgroundrbに関しては互換性がないので。
config/backgroundrb.yml &#8211; 設定ファイル
セットアップ直後のconfig/backgroundrb.ymlの内容は次の通り。
:backgroundrb:
  :port: 11006
  :ip: 0.0.0.0 
このファイルで動作環境（production,development,test）やログに関する設定、スケジューリングの定義などを行うことができる。
なお必要があればerbのテンプレートに書くのと同じ要領で変数の埋め込みが可能。
特にいじらないでも動かすだけなら動くのでここではこのままで行く。
ワーカー（worker）の作成
バックグラウンドで行いたい処理の内容はlib/workers以下のワーカーのスクリプトに書く。
コントローラやモデルと同じようにジェネレータでワーカーのひな形を作ることができる。
$ ruby script/generate worker Foo
exists  lib/workers/
create  lib/workers/foo_worker.rb 
ジェネレータで作られたワーカーの内容は以下のごとく。
class FooWorker &#60; BackgrounDRb::MetaWorker
  set_worker_name [...]]]></description>
			<content:encoded><![CDATA[<div class="notice">
2010年5月追記 今使うなら<a href="http://github.com/tobi/delayed_job">delayed_job</a>とか<a href="http://github.com/defunkt/resque">Resque</a>とかがいいっぽいです。今動いてるものはまだしも今から作るものでBackgrounDrbはやめた方がたぶん幸せになれます。
</div>
<p>BackgrounDRbは名前の通りバックグラウンドでの処理に便利なプラグイン。</p>
<p>2007年の末に1.0がリリースされていた。<br />
現在のバージョンは1.0.3になっている。</p>
<p>BackgrounDRbを使うとバックグラウンドの処理をコントローラからキックしてスタートさせたり、BackgrounDRbの持つスケジューリング機能によって実行することができる。<br />
つまり時間のかかる非同期処理やバッチ処理に使うことができる。<br />
ロギングやステータス確認の仕組みも整っていて、バックグラウンド処理のフレームワークとしてなかなかいいかんじになっている。</p>
<p>1.0になって以前のバージョンとは互換性がなくなっている部分もあるので、アップグレードするには若干コードの修正が必要になるかもしれない。<br />
またWindows上のサーバで使えなくなっているようだ。（対応の予定はあるそうだ）</p>
<p>以下にインストールから軽く使うまでをまとめてみた。</p>
<h4>インストール</h4>
<p>BackgrounDRbはchronicとpacketというgemに依存しているのでRailsのプラグインとして入れる前にそれらを入れる必要がある。</p>
<pre><code>$ sudo gem install chronic packet</code></pre>
<p>BackgrounDRbのインストールは次のコマンドで。</p>
<pre><code>$ ruby script/plugin install http://svn.devjavu.com/backgroundrb/trunk</code></pre>
<p>ちなみに古いバージョンが入っている場合は事前に消しておいた方がいい。</p>
<h4>セットアップ</h4>
<p>使い始める前に rake backgroundrb:setup でセットアップが必要。<br />
rakeコマンドでセットアップすると必要なファイルやスクリプトがRAILS_ROOT以下に配置される。</p>
<pre><code>$ rake backgroundrb:setup
(in /var/www/bgrb_sample)
Copying backgroundrb.yml config file to /var/www/bgrb_sample/config/backgroundrb.yml
Copying backgroundrb script to /var/www/bgrb_sample/script/backgroundrb
Creating /var/www/bgrb_sample/lib/workers
Copying Worker Test helper file /var/www/bgrb_sample/test/bdrb_test_helper.rb</code></pre>
<p>古いバージョンを入れていた場合はこれらのファイルも消すか待避させておく必要がある。<br />
特にbackgroundrb.ymlとscript/backgroundrbに関しては互換性がないので。</p>
<h4>config/backgroundrb.yml &#8211; 設定ファイル</h4>
<p>セットアップ直後のconfig/backgroundrb.ymlの内容は次の通り。</p>
<pre><code>:backgroundrb:
  :port: 11006
  :ip: 0.0.0.0 </code></pre>
<p>このファイルで動作環境（production,development,test）やログに関する設定、スケジューリングの定義などを行うことができる。<br />
なお必要があればerbのテンプレートに書くのと同じ要領で変数の埋め込みが可能。</p>
<p>特にいじらないでも動かすだけなら動くのでここではこのままで行く。</p>
<h4>ワーカー（worker）の作成</h4>
<p>バックグラウンドで行いたい処理の内容はlib/workers以下のワーカーのスクリプトに書く。<br />
コントローラやモデルと同じようにジェネレータでワーカーのひな形を作ることができる。</p>
<pre><code>$ ruby script/generate worker Foo
exists  lib/workers/
create  lib/workers/foo_worker.rb </code></pre>
<p>ジェネレータで作られたワーカーの内容は以下のごとく。</p>
<pre><code>class FooWorker &lt; BackgrounDRb::MetaWorker
  set_worker_name :foo_worker
  def create(args = nil)
    # method gets called, when new instance of worker is created.
  end
end </code></pre>
<p>createメソッドの内容はワーカーのインスタンスが作成されたときに実行される。<br />
それ以外にメソッドを定義していくと、コントローラやスケジューリングによってキックすることが可能なタスクになる。</p>
<p>とりあえずログに実行した時刻と渡されたメッセージを記録するだけのタスクを作ってみる。</p>
<pre><code>class FooWorker &lt; BackgrounDRb::MetaWorker
  set_worker_name :foo_worker
  def create(args = nil)
    # method gets called, when new instance of worker is created.
  end

  def bar(message = 'nothing')
    logger.info "#{Time.now} #{message}"
  end
end </code></pre>
<p>なおメソッドの引数はタスク呼び出し側の仕様でひとつしか与えられない。<br />
複数の値をタスクに渡したい場合は引数をハッシュなどにするといいだろう。</p>
<h4>BackgrounDRbサーバの起動</h4>
<p>ワーカーができたらBackgrounDRbサーバを起動。<br />
以前のバージョンではrakeで起動していたが、スクリプト直叩きになった。</p>
<pre><code>$ ruby script/backgroundrb start</code></pre>
<p>-eで環境を指定できる。（設定ファイルに書くこともできるが、ここで指定することもできる）</p>
<pre><code>$ ruby script/backgroundrb start -e production</code></pre>
<p>何も指定しないとdevelopmentで動く。</p>
<p>ちなみに起動時に定義されているすべてのワーカーのインスタンスがひとつずつ作られる。（これを抑制する方法はあるがとりあえず割愛）</p>
<h4>コントローラからタスクをキック</h4>
<p>いわゆる非同期処理的使い方。</p>
<p>MiddleManというプロキシ的なクラスを使ってワーカーのインスタンスを取得してタスクを呼び出す。<br />
そこ中の人とか呼ばないように。</p>
<pre><code>worker = MiddleMan.worker(:foo_worker)
worker.bar('Hello from some controller')</code></pre>
<p>これを例えばコントローラのアクションに書いておくと、そのアクションが呼び出されたときに非同期でタスクが走り始める。<br />
非同期なのでタスクの終了を待たずにアクションの処理は次の行以降へと進んでいく。</p>
<h4>スケジューリングによってタスクをキック</h4>
<p>こちらはいわゆるバッチ処理的使い方。</p>
<p>いくつか方法があるが、ここではCronっぽく設定ファイルに定義する方法で。<br />
config/backgroundrb.ymlの末尾に以下の内容を追加する。</p>
<pre><code>:schedules:
  :foo_worker:
    :bar:
      :trigger_args: * * * * * *
      :data: Hello from a cron style scheduler</code></pre>
<p>trigger_argsにcrontabに書くのと同じ形式でスケジューリングする。<br />
dataはタスクに渡る引数。</p>
<p>つまりこの場合はFooWorkerのbarメソッドが引数 &#8220;Hello from a cron style scheduler&#8221; で毎秒呼び出される。</p>
<h4>BackgrounDRbサーバの停止</h4>
<p>以上のお試しが終わったら一応停止しておく。<br />
起動の仕方がわかれば停止の仕方も察しがつくと思うが、その通りstopで。</p>
<pre><code>$ ruby script/backgroundrb stop</code></pre>
<p>開発中でもタスクの内容を変更するとBackgrounDRbサーバを再起動しないと行けないのでちょっとめんどい。<br />
その時restartみたいな気の利いたオプションは用意されてないのでstopしてからstartしないといけないのでさらにめんどい。</p>
<h4>以上</h4>
<p>とりあえず動かすまで。<br />
その他諸々に関してはまた別途まとめる。かもしれない。</p>
<p>ところで自分の環境の問題かもしれないけど、タスク呼び出しの取りこぼしなどがある気がするので（BackgrounDRbサーバ起動途中やワーカー作り途中でタスクをキックすると無言でスルーしてくれるような？）安定を求める人はもうちょっと待つか、その対策をして使った方がいいかもです。</p>
<h4>参考</h4>
<ul>
<li><a href="http://backgroundrb.rubyforge.org/" target="_blank">BackgrounDRb &#8211; Introduction BackgrounDRb</a></li>
<li><a href="http://gnufied.org/2007/12/20/backgroundrb-10-released/" target="_blank">A Place for my head ≫ BackgrounDRb 1.0 released</a></li>
</ul>
<h4>追記</h4>
<p>一応Railsアプリのバッチ処理に関する以前の記事もよろしければどうぞ。</p>
<ul>
<li><a href="http://brass.to/blog/rails_batch_3.html">RailsアプリでActiveRecordを使ったバッチ処理 その３</a></li>
<li><a href="http://brass.to/blog/rails_batch_2.html">RailsアプリでActiveRecordを使ったバッチ処理 その２</a></li>
<li><a href="http://brass.to/blog/rails_batch.html">RailsアプリでActiveRecordを使ったバッチ処理</a></li>
</ul>
<h4>追記2</h4>
<p>このあとBackgrounDRbに関する記事をいくつか書いてます。</p>
<ul>
<li><a href="http://brass.to/blog/backgroundrb_scheduling.html">BackgrounDRbによるタスクのスケジューリング方法まとめ</a></li>
<li><a href="http://brass.to/blog/little_lacks_of_backgroundrb.html">http://brass.to/blog/little_lacks_of_backgroundrb.html</a></li>
<li><a href="http://brass.to/blog/backgroundrb_set_no_auto_load.html">BackgrounDRbでワーカーの自動起動を制御するメソッド</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/backgroundrb.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>メールアドレスのバリデーションを行うRailsプラグイン</title>
		<link>http://brass.to/blog/validate_email.html</link>
		<comments>http://brass.to/blog/validate_email.html#comments</comments>
		<pubDate>Sat, 08 Mar 2008 13:49:50 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/validate_email.html</guid>
		<description><![CDATA[独自に実装すると割とめんどいメールアドレスのバリデーションを行うプラグイン二種。
validates_format_ofでやってたけどプラグインあるなら使った方が楽だなということで。
validates_email_format_of
Railsify! &#62; Plugins &#62; validates_email_format_of
単純に正規表現によるフォーマットチェックでバリデーションを行うプラグイン。
インストール
ruby script/plugin install http://code.dunae.ca/validates_email_format_of/
サンプルコード
class User &#60; ActiveRecord::Base
  validates_email_format_of :email
end
validates_email_veracity_of
Railsify! &#62; Plugins &#62; validates_email_veracity_of
こちらはフォーマットチェックの他にドメインの存在チェックまで可能なプラグイン。
許可しないドメインも指定できるので、フリーメールのアドレスは不可、といったことも実装できる。
インストール
ruby script/plugin install http://svn.savvica.com/public/plugins/validates_email_veracity_of
サンプルコード
class User &#60; ActiveRecord::Base
  validates_email_veracity_of :email, :mx_only =&#62; true,
                          [...]]]></description>
			<content:encoded><![CDATA[<p>独自に実装すると割とめんどいメールアドレスのバリデーションを行うプラグイン二種。<br />
validates_format_ofでやってたけどプラグインあるなら使った方が楽だなということで。</p>
<h4>validates_email_format_of</h4>
<p><a href="http://railsify.com/plugins/42-validates_email_format_of" target="_blank">Railsify! &gt; Plugins &gt; validates_email_format_of</a></p>
<p>単純に正規表現によるフォーマットチェックでバリデーションを行うプラグイン。</p>
<h5>インストール</h5>
<pre><code>ruby script/plugin install http://code.dunae.ca/validates_email_format_of/</code></pre>
<h5>サンプルコード</h5>
<pre><code>class User &lt; ActiveRecord::Base
  validates_email_format_of :email
end</code></pre>
<h4>validates_email_veracity_of</h4>
<p><a href="http://railsify.com/plugins/102-validates_email_veracity_of" target="_blank">Railsify! &gt; Plugins &gt; validates_email_veracity_of</a></p>
<p>こちらはフォーマットチェックの他にドメインの存在チェックまで可能なプラグイン。<br />
許可しないドメインも指定できるので、フリーメールのアドレスは不可、といったことも実装できる。</p>
<h5>インストール</h5>
<pre><code>ruby script/plugin install http://svn.savvica.com/public/plugins/validates_email_veracity_of</code></pre>
<h5>サンプルコード</h5>
<pre><code>class User &lt; ActiveRecord::Base
  validates_email_veracity_of :email, :mx_only =&gt; true,
                                      :invalid_domains =&gt; ["example.com", "example.co.jp"]
end</code></pre>
<p>オプションをいろいろと指定できる。</p>
<h5>オプション</h5>
<table>
<tr>
<th>オプション</th>
<th>内容</th>
<th>デフォルト</th>
</tr>
<tr>
<td>:message</td>
<td>エラーメッセージ</td>
<td>&#8220;is invalid.&#8221;</td>
</tr>
<tr>
<td>:domain_check</td>
<td>ドメインの存在チェックを行うかどうか</td>
<td>true</td>
</tr>
<tr>
<td>:mx_only</td>
<td>ドメインの存在に加えてMXレコードまでチェックする</td>
<td>false</td>
</tr>
<tr>
<td>:timeout</td>
<td>ドメインルックアップのタイムアウトまでの時間（秒）</td>
<td>2</td>
</tr>
<tr>
<td>:fail_on_timeout</td>
<td>タイムアウトした場合にバリデーション失敗とするかどうか</td>
<td>false</td>
</tr>
<tr>
<td>:timeout_message</td>
<td>タイムアウトでバリデーション失敗した場合のエラーメッセージ</td>
<td>&#8220;domain is currently unreachable, try again later.&#8221;</td>
</tr>
<tr>
<td>:invalid_domains</td>
<td>許可しないドメインのリストを配列で指定する</td>
<td>[]</td>
</tr>
<tr>
<td>:invalid_domain_message</td>
<td>許可しないドメインのためにバリデーション失敗した場合のエラーメッセージ</td>
<td>&#8220;provider is not supported, try another email address.&#8221;</td>
</tr>
</table>
<h4>正規表現比較</h4>
<p>自作すると記号入りのアドレスとかへの考慮を忘れがちだったりするメールアドレスの正規表現。<br />
微妙に決定版がないので困る。<br />
二つのプラグインも別々のものを使っている。</p>
<p>validates_email_format_ofのコード。</p>
<pre><code>  Regex = /
    ^(
      ([A-Za-z0-9]+_+)|
      ([A-Za-z0-9]+-+)|
      ([A-Za-z0-9]+.+)|
      ([A-Za-z0-9]+++)
    )*[A-Za-z0-9]+@
    ((w+-+)|(w+.))*w{1,63}.[a-zA-Z]{2,6}$
  /ix</code></pre>
<p>validates_email_veracity_ofのコード。</p>
<pre><code>/A([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})Z/i</code></pre>
<p>ちなみに今まで使ってたコード。</p>
<pre><code>/^[x01-x7F]+@(([-a-zA-Z0-9]+.)*[a-zA-Z]+|[d{1,3}.d{1,3}.d{1,3}.d{1,3}])$|^$/</code></pre>
<p><a href="http://www.tt.rim.or.jp/~canada/comp/cgi/tech/mailaddrmatch/" target="_blank">メールアドレスに一致する正規表現</a>より拝借。</p>
<p>Google先生に聞くと他にもいろいろ見つかるけど、どんな正規表現が一番使われているんだろうな。</p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/validate_email.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rails WidgetsのTabnavでさくっとタブナビゲーション</title>
		<link>http://brass.to/blog/rails_widgets_tabnav.html</link>
		<comments>http://brass.to/blog/rails_widgets_tabnav.html#comments</comments>
		<pubDate>Wed, 27 Feb 2008 14:46:44 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/rails_widgets_tabnav.html</guid>
		<description><![CDATA[またネタもとがつくるぶなわけですが。
つくるぶガイドブログ: Rails で Yahoo 検索 API + Widgets Tabnav でタブナビゲーション
タブナビゲーションほしいぜタブナビゲーション、とちょっと前から思っていたので早速試してみたらあっさりタブナビゲーションができてしまった。スゲー。
世の中どんどん便利になｒ
で、元記事がわかりやすいので感動を伝える以外何も書くことはないわけですが、せっかくなのでひとつだけ。
タブナビゲーション用の部分テンプレートのサンプルコードを一部抜粋。
&#60;%
render_tabnav :yahoo_search,
              :generate_css =&#62; true do 
ここで :generate_css を true にすることで出力されるHTMLソース内にタブの外観を整えるためのCSSが吐かれる。
そのCSSをコピペして別のcssファイルに保存してやるとタブの外観をカスタマイズするのに便利。
そうしたらもうCSSを吐いてもらう必要はないので :generate_css を true にする必要はないのでそのオプションは削ってよい。
デフォルトが false のようなので、指定をなくすだけでおｋ。
&#60;%
render_tabnav :yahoo_search do 
以上でした。
Tabnavの他にもいくつか機能があるようなので暇を見て試してみようかな。
参考
SeeSaw &#124; Rails Widgets
]]></description>
			<content:encoded><![CDATA[<p>またネタもとが<a href="http://www.tkrb.jp/guide/" target="_blank">つくるぶ</a>なわけですが。</p>
<p><a href="http://www.tkrb.jp/guide/2008/02/rails_yahoo_api_widgets_tabnav.html" target="_blank">つくるぶガイドブログ: Rails で Yahoo 検索 API + Widgets Tabnav でタブナビゲーション</a></p>
<p>タブナビゲーションほしいぜタブナビゲーション、とちょっと前から思っていたので早速試してみたらあっさりタブナビゲーションができてしまった。スゲー。<br />
世の中どんどん便利になｒ</p>
<p>で、元記事がわかりやすいので感動を伝える以外何も書くことはないわけですが、せっかくなのでひとつだけ。</p>
<p>タブナビゲーション用の部分テンプレートのサンプルコードを一部抜粋。</p>
<pre><code>&lt;%
render_tabnav :yahoo_search,
              :generate_css =&gt; true do </code></pre>
<p>ここで :generate_css を true にすることで出力されるHTMLソース内にタブの外観を整えるためのCSSが吐かれる。<br />
そのCSSをコピペして別のcssファイルに保存してやるとタブの外観をカスタマイズするのに便利。</p>
<p>そうしたらもうCSSを吐いてもらう必要はないので :generate_css を true にする必要はないのでそのオプションは削ってよい。<br />
デフォルトが false のようなので、指定をなくすだけでおｋ。</p>
<pre><code>&lt;%
render_tabnav :yahoo_search do </code></pre>
<p>以上でした。</p>
<p>Tabnavの他にもいくつか機能があるようなので暇を見て試してみようかな。</p>
<h4>参考</h4>
<p><a href="http://www.seesaw.it/en/toolbox/widgets" target="_blank">SeeSaw | Rails Widgets</a></p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/rails_widgets_tabnav.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>will_paginateに移行</title>
		<link>http://brass.to/blog/will_paginate.html</link>
		<comments>http://brass.to/blog/will_paginate.html#comments</comments>
		<pubDate>Thu, 21 Feb 2008 23:53:50 +0000</pubDate>
		<dc:creator>akahige</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[rails-plugin]]></category>

		<guid isPermaLink="false">http://brass.to/blog/will_paginate.html</guid>
		<description><![CDATA[will_paginateのアップデートによってインストール方法など一部の情報が古くなっています。
関連：will_paginateもgithubに行ってた
この間Rails2.0に移行したときにいったん放置したwill_paginateへの移行を行ったのでメモ。
それほど手間ではなかった。
ぐーぐる先生が教えてくれたページやREADMEを読みつつ作業。
プラグインのインストール
さくっと。
$ script/plugin install svn://errtheblog.com/svn/plugins/will_paginate
コントローラの修正
以下のようにコードを修正。コメントアウトしたものは修正前のもの。
def list
  # @pages, @items = paginate(:items, :conditions => ["deleted = 0"], :order => 'created_at desc', :per_page => 10)
  @items = Item.paginate(:page => params[:page], :conditions => ["deleted = 0"], :order => 'created_at desc', :per_page => 10)
end
モデルにpaginateというメソッドがつくっぽい。
引数の :page で表示するページ数を指定して、:per_page でページあたりの表示件数を指定する。
上記のコードでは表示するページ数はクエリのpageというパラメータから取るかんじ。
またpaginate_by_xxxというメソッドも使えるようになるので、
@items = Item.paginate_by_user_id @user.id, :page => params[:page]
のような使い方もできるようだ。
ビューの修正
ヘルパーを使うとそこにページネーションが表示される。
&#60;%= will_paginate(@items) %>
これで終わり。
will_paginateってのはまあクラシックなページネーションのpagination_linksみたいなもんですな。
従来のページ管理オブジェクトが持っていたようなメソッドもActiveRecordオブジェクトのメソッドに付加される、あるいはもともとあるメソッドで代用できる模様。
互換性は意識されてないようなので、ページ管理オブジェクトを使ってがんばってオリジナルのページネーションを作っていた人はいろいろ書き換える必要がありそう。


メソッド
内容


size
総件数。


page_count
総ページ数。


per_page
1ページあたりの表示件数。


previous_page
現在のページの前のページ番号。存在しない場合はnil


next_page
現在のページの次のページ番号。存在しない場合はnil


offset
現在のページの最初のレコードのオフセット。


例えば以下のようにビューの中で使ったりできる。
&#60;%= @items.page_count %>
will_paginateのオプション
オプションを与えると外観をカスタマイズできる。


オプション
内容
デフォルト値


:class
ページネーションを囲むdivタグ（コンテナ）につくCSSクラス名
 &#8220;pagination&#8221; [...]]]></description>
			<content:encoded><![CDATA[<div class="notice">will_paginateのアップデートによってインストール方法など一部の情報が古くなっています。</p>
<p>関連：<a href="http://brass.to/blog/will_paginate_github.html">will_paginateもgithubに行ってた</a></div>
<p>この間Rails2.0に移行したときにいったん放置したwill_paginateへの移行を行ったのでメモ。<br />
それほど手間ではなかった。</p>
<p>ぐーぐる先生が教えてくれたページやREADMEを読みつつ作業。</p>
<h4>プラグインのインストール</h4>
<p>さくっと。</p>
<pre><code>$ script/plugin install svn://errtheblog.com/svn/plugins/will_paginate</code></pre>
<h4>コントローラの修正</h4>
<p>以下のようにコードを修正。コメントアウトしたものは修正前のもの。</p>
<pre><code>def list
  # @pages, @items = paginate(:items, :conditions => ["deleted = 0"], :order => 'created_at desc', :per_page => 10)
  @items = Item.paginate(:page => params[:page], :conditions => ["deleted = 0"], :order => 'created_at desc', :per_page => 10)
end</code></pre>
<p>モデルにpaginateというメソッドがつくっぽい。<br />
引数の :page で表示するページ数を指定して、:per_page でページあたりの表示件数を指定する。<br />
上記のコードでは表示するページ数はクエリのpageというパラメータから取るかんじ。</p>
<p>またpaginate_by_xxxというメソッドも使えるようになるので、</p>
<pre><code>@items = Item.paginate_by_user_id @user.id, :page => params[:page]</code></pre>
<p>のような使い方もできるようだ。</p>
<h4>ビューの修正</h4>
<p>ヘルパーを使うとそこにページネーションが表示される。</p>
<pre><code>&lt;%= will_paginate(@items) %></code></pre>
<p>これで終わり。</p>
<p>will_paginateってのはまあクラシックなページネーションのpagination_linksみたいなもんですな。</p>
<p>従来のページ管理オブジェクトが持っていたようなメソッドもActiveRecordオブジェクトのメソッドに付加される、あるいはもともとあるメソッドで代用できる模様。<br />
互換性は意識されてないようなので、ページ管理オブジェクトを使ってがんばってオリジナルのページネーションを作っていた人はいろいろ書き換える必要がありそう。</p>
<table>
<tr>
<th>メソッド</th>
<th>内容</th>
</tr>
<tr>
<td>size</td>
<td>総件数。</td>
</tr>
<tr>
<td>page_count</td>
<td>総ページ数。</td>
</tr>
<tr>
<td>per_page</td>
<td>1ページあたりの表示件数。</td>
</tr>
<tr>
<td>previous_page</td>
<td>現在のページの前のページ番号。存在しない場合はnil</td>
</tr>
<tr>
<td>next_page</td>
<td>現在のページの次のページ番号。存在しない場合はnil</td>
</tr>
<tr>
<td>offset</td>
<td>現在のページの最初のレコードのオフセット。</td>
</tr>
</table>
<p>例えば以下のようにビューの中で使ったりできる。</p>
<pre><code>&lt;%= @items.page_count %></code></pre>
<h4>will_paginateのオプション</h4>
<p>オプションを与えると外観をカスタマイズできる。</p>
<table>
<tr>
<th>オプション</th>
<th>内容</th>
<th>デフォルト値</th>
</tr>
<tr>
<td>:class</td>
<td>ページネーションを囲むdivタグ（コンテナ）につくCSSクラス名</td>
<td> &#8220;pagination&#8221; </td>
</tr>
<tr>
<td>:prev_label</td>
<td> 前のページへのリンクのラベル </td>
<td> &#8220;≪ Previous&#8221; </td>
</tr>
<tr>
<td>:next_label</td>
<td> 次のページへのリンクのラベル </td>
<td> &#8220;Next ≫&#8221; </td>
</tr>
<tr>
<td>:inner_window</td>
<td> 現在のページをの両隣何ページ分までリンクを表示するか </td>
<td> 4 </td>
</tr>
<tr>
<td>:outer_window</td>
<td> 1ページ目と最後のページからそれぞれ何ページ分までリンクを表示するか </td>
<td> 1 </td>
</tr>
<tr>
<td>:separator</td>
<td> ページとページの間のセパレータ </td>
<td> &#8221; &#8221; （半角スペース）</td>
</tr>
<tr>
<td>:param_name</td>
<td> ページ数を表すパラメータの名前。例えば &#8220;p&#8221; にすると &#8220;p=1&#8243; とか &#8220;p=3&#8243; とか言うクエリパラメータになる。</td>
<td> &#8220;page&#8221; </td>
</tr>
<tr>
<td>:params</td>
<td> 各ページへのリンクにつける追加パラメータ。例えば :controller => &#8220;foo&#8221;, :action => nil など</td>
<td> nil </td>
</tr>
<tr>
<td>:renderer</td>
<td> リンクを描画するレンダラークラスを指定できる </td>
<td> WillPaginate::LinkRenderer </td>
</tr>
<tr>
<td>:page_links</td>
<td> 各ページへのリンクを表示するか否か。falseにすると各ページへのリンクは表示されず、前と次のページへのリンクのみ表示される。 </td>
<td> true </td>
</tr>
<tr>
<td>:container</td>
<td> ページネーションをdivタグ（コンテナ）で囲むか否か。</td>
<td> true </td>
</tr>
<tr>
<td>:id</td>
<td> ページネーションを囲むdivタグ（コンテナ）のidを指定できる。<br />
文字列でなくtrueを指定するとモデルのクラス名を小文字化したものに &#8220;_pagenation&#8221; がついたものになる。</td>
<td> nil </td>
</tr>
<tr>
</tr>
</table>
<p>:inner_windowと:outer_windowの挙動が若干おかしいような気がしないでもない・・・</p>
<p>以下サンプルコード。</p>
<pre><code>< %= will_paginate(@items, :prev_label => '前', :next_label => '次', :params_name => 'p') %></code></pre>
<p>前後のページに進むリンクのラベルを変更し、クエリストリングのページ番号を表すパラメータを「p」に変更している。<br />
なお:params_nameを変えたらコントローラ側でも変更が必要になるので注意。</p>
<pre><code>@items = Item.paginate(:page => params[:p], :per_page => 10)</code></pre>
<h4>スタイルを当てる</h4>
<p>READMEに載っている次のスタイルを当てるとちょっとかっこよくなる。</p>
<pre><code>.pagination {
  padding: 3px;
  margin: 3px;
}
.pagination a {
  padding: 2px 5px 2px 5px;
  margin: 2px;
  border: 1px solid #aaaadd;
  text-decoration: none;
  color: #000099;
}
.pagination a:hover, .pagination a:active {
  border: 1px solid #000099;
  color: #000;
}
.pagination span.current {
  padding: 2px 5px 2px 5px;
  margin: 2px;
  border: 1px solid #000099;
  font-weight: bold;
  background-color: #000099;
  color: #FFF;
}
.pagination span.disabled {
  padding: 2px 5px 2px 5px;
  margin: 2px;
  border: 1px solid #eee;
  color: #ddd;
}</code></pre>
<p>paginationというクラス名はヘルパーのオプションで変更してたらそれにあわせること。</p>
<h4>参考</h4>
<p>- <a href="http://rock.errtheblog.com/will_paginate/files/README.html" target="_blank">will_paginate README</a><br />
- <a href="http://d.hatena.ne.jp/idesaku/20071210/1197260363" target="_blank">Ruby on Rails 2.0.1に対応 &#8211; idesaku blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://brass.to/blog/will_paginate.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
