Railsのacts_as_searchableプラグインに類似検索機能をつけた acts_as_searchable_with_similarityを、GitHubに移管いたしました。

http://github.com/genki/acts_as_searchable_with_similarity/tree/master

今後はこちらをお使いいただけるとありがたいです。

posted by Png genki on Sat 25 Oct 2008 at 05:22

久々にRailsプラグインの紹介です。

Plugins - NamedScope

This is not simple hack of named scope like you might find in WillPaginate. This is a fully backported and tested version of NamedScope that will work on rails 1.2.6 or 2.0.4.

Rails-2.0.4およびRails-1.2.6でNamedScopeが使えるようになるようです。

posted by Png genki on Sun 5 Oct 2008 at 07:29

This release includes a small spec change.

I changed spec of count method. Now it works without :group option. If you want old behaviour, you can use count_ids method instead.

http://github.com/genki/pagination_scope/tree/master

Good luck ;-)

posted by Png takiuchi on Sun 28 Sep 2008 at 03:57
16th Sat

pagination_scope

named_scopeによるPagination を行うためのGemを作りました。 通常はwill_paginateを利用するほうがいいと思いますが、 :joinsを含む複雑なnamed_scopeを介してpaginationを行いたい場合には、 利用すると便利かもしれません。

pagination_scope

使い方

まず、モデルクラスの中でincludeします。

   1  class Post
   2    include PaginationScope
   3  end

これによって、Postクラスにpaginateというnamed_scopeが作成されます。

続いて、Paginationを利用したいコントローラのアクションメソッド内で、

   1  class PostsController < ApplicationController
   2    def index
   3      @posts = Post.not_deleted.paginate(params[:page], 10)

のようにScopeを取得します。

続いて、Viewで以下のようにPagination用HTMLを生成します。

   1  <%= paginate @posts %>

paginateメソッドは PaginationScope によって導入されるViewヘルパーです。

posted by Png genki on Sat 16 Aug 2008 at 23:25

named_scopeは大変素晴らしいRailsの新しい機能ですが、 おなじみのwith_scopeのように、 スコープつきのブロックを伴った利用ができないという問題がありました。 例えばこんな感じに利用しようとしてもうまくいきません。

   1  User.active do
   2    User.count # => Not run
   3  end
   4  
   5  User.active.with_scope do
   6    User.count #=> Not scoped
   7  end

そこで、昔ながらのwith_scopeと同じようにnamed_scopeを使えるようにする Gemプラグインを作りました。

with_named_scope

これを使うと、以下のように期待通りに動きます。

   1  User.active.with do
   2    User.count #=> User.active.count
   3  end

なかなか便利だと思うので、Rails本家にパッチを送っておきました。

Improved named_scope to be used like as with_scope

posted by Png genki on Fri 1 Aug 2008 at 21:16

ちょっとActiveScaffoldを使う機会があったので自分用にメモ。

まずは配布サイト。

インストール方法。

   1  % ./script/plugin install http://activescaffold.googlecode.com/svn/tags/active_scaffold

利用レポート、チュートリアルなど。

ActiveScaffoldの前身であるAjaxScaffoldGeneratorはGemで提供されていたのですが、ActiveScaffoldはプラグインのみの提供。

posted by Png genki on Sun 13 Apr 2008 at 20:33 with 1 comment

久々にRailsプラグインの紹介です。

BackgroundFu は、Jacek Becela氏による、時間がかかる処理をバックグラウンドプロセスで実行するためのRailsプラグインです。

使い方ですが、まずはインストール。

   1  % svn export https://svn.trix.pl/public/background_fu vendor/plugins/background_fu

続いて、各種ファイルを生成するGeneratorを起動します。

   1  % ./script/generate background

バックグラウンド処理の情報を管理するテーブルを作成するためのmigration ファイルが生成されるので、マイグレーションを実行します。

   1  % rake db:migrate

これでひとまず準備完了。あとは、lib/workersの下に生成されている exampleファイルや README を参考にしながら、Workerクラスを作ります。

Workerクラスの例

   1  class ExampleWorker
   2    def add(a, b)
   3      a + b
   4    end
   5  end

このWorkerを呼び出す場合は、以下のようにします。

   1  Job.enqueue!(ExampleWorker, :add, 1, 2)

単純に時間がかかる処理を裏で実行したいだけならこれでOKです。 簡単ですね。 必要であれば、JobのIDを使ってもうちょっと複雑な処理も実行可能です。

Workerプロセスの起動は、以下のコマンドで行います。

   1  % ./script/daemons start

stopで停止、restartで再起動です。RAILS_ENVを指定する場合は、

   1  % RAILS_ENV=production ./script/daemons start

こんな感じですね。デフォルトではdevelopment環境になります。

See Also

posted by Png genki on Tue 25 Mar 2008 at 03:58

While creating AR extending plugin, I had some trouble to test it. Because testing a such plugin needs creating db and its absurd. So here's my solution. 

Tip #1: First, extend the AR, and name it as a MockBase. Then extend MockBase to test your class. This prevents other tests like your rails app or other plugins from failing.

Tip #2. Requiring environment.rb loads all rails env this includes AR. Thus you can you use AR in your test class.

   1  #acts_as_notifiable_test.rb
   2  begin
   3    require File.dirname(__FILE__) + '/../../../../config/environment'
   4  rescue LoadError
   5    require 'rubygems'
   6    gem 'activerecord'
   7    require 'active_record'
   8  end
   9  
  10  class MockBase < ActiveRecord::Base; end
  11  MockBase.class_eval do
  12    alias_method :save, :valid?
  13    def self.columns() @columns ||= []; end
  14  
  15    def self.column(name, sql_type = nil, default = nil, null = true)
  16      columns << ActiveRecord::ConnectionAdapters::Column.new(name.to_s, default, sql_type, null)
  17    end
  18  end
  19  
  20  class MockModel < MockBase
  21    acts_as_notifiable :callback => :after_create, :message => "hello", :recipients => "test@gmail.com"
  22  end
  23  
  24  class ActsAsNotifiableTest < Test::Unit::TestCase
  25    def test_option_message_string
  26      assert_equal "hello", MockModel.new.instance_eval{jabber_message}
  27    end

Reference

posted by Png hibi on Thu 20 Mar 2008 at 23:58

数年に渡ってメンテナンスされているようなRailsアプリケーションの config/routesは、 徐々にスパゲッティ化していく傾向があるように思えます。 ということで、今回は、 コントローラごとにRoutesをまとめて綺麗に記述する方法を紹介します。

方法は簡単です。with_optionsを使って、 prefixオプションを指定するようにします。

   1  map.with_options(:controller => 'posts',
   2      :name_prefix => 'posts_',
   3      :path_prefix => 'posts') do |posts|
   4    # posts_rss_path => 'posts/rss'
   5    posts.rss 'rss', :action => 'rss'
   6  end

しかし、全部のControllerにこれを書くのは面倒かもしれません。 ということで、プラグインを作りました。

このプラグインを使えば、以下のようにRoutesを書くことができます。

   1  map.with_controller('posts') do |posts|
   2    posts.rss # posts_rss_path => 'posts/rss'
   3  end

map.namespace(:posts)を使うと似たようなことができるのですが、 これは名前空間の作成に特化されているので、 今回の目的のために使用すると、若干思わしくない挙動をするようです。

posted by Png genki on Fri 14 Mar 2008 at 22:37

RaPT については以前 「RaPT: Railsプラグイン管理ツール」 で紹介しましたが、 手短にRaPTを使ってRailsプラグインを使う方法をまとめておきます。

インストール

   1  # gem install rapt

プラグインをインストール

RAILS_ROOTで以下を実行。

   1  $ rapt install http://repo.pragprog.com/svn/Public/plugins/annotate_models

プラグインをアップデート

まさにこの為にRaptを使う価値があるという代物。

   1  $ rapt update annotate_models

便利です。

posted by Png genki on Thu 6 Mar 2008 at 14:57 with 2 comments