記事の引越しから漏れていたのでサルベージ。

Generatorプラグインの作り方をメモしておきます。

まずはプラグインの雛形を作ります。

   1  $ ./script/generate plugin foo

次にGeneratorプラグインに必要なディレクトリを用意。

   1  $ mkdir -p vendor/plugins/foo/generators/foo/templates

FooGeneratorクラスの定義ファイルを作成

vendor/plugins/foo/generators/foo/foo_generator.rb

   1  class FooGenerator < Rails::Generator::NamedBase
   2    def initialize(runtime_args, runtime_options = {})
   3      super
   4      ~ 引数・オプションの解釈と初期化 ~
   5    end
   6  
   7    def manifest
   8      record do |m|
   9        ~ マニフェスト ~
  10      end
  11    end
  12  end

マニフェストの書き方は この辺 が参考になります。基底クラスは、Rails::Generator::Baseの派生クラスなら何でもOKです。

続いて、マニフェストから参照するテンプレートファイルをtemplatesディレクトリの中に作ります。テンプレートファイルはERbテンプレートなので、Generatorクラスのコンテクストでrhtmlを書くような感じで記述できます。

以上で完了。Generatorを使うときは以下の通り。

   1  $ ./script/generate foo 

マニフェストの書式を以下にまとめておきます。

m.class_collisions( *class_names)

生成するクラス名の衝突を検出します。 Generatorで生成する予定のクラス名をすべて列記しておきましょう。

m.directory(relative_path)

RAILS_ROOTからの相対パスで、指定したディレクトリを利用する事を 宣言します。

m.template(relative_source, relative_destination, template_options = {})

Generatorが生成するファイルを宣言します。relative_sourceは、templatesディレクトリからの相対パスでERbテンプレートを指定します。relative_destinationには生成されるファイルの場所をRAILS_ROOTからの相対パスで記述します。

template_optionsには、:assigns => {:foo => some_thing} のような感じで、ERbテンプレートから参照可能な値を設定する事ができます。

m.readme( *relative_sources)

helpドキュメントを指定します。指定したファイル群は単純に連続出力されます。

m.migration_template(relative_source, relative_destination, template_options = {})

migrationファイルの生成を宣言します。migrationファイルは、ファイル名の先頭に005_のようなプレフィックスが付くので、専用のメソッドが用意されています。

relative_destinationは、migrationファイルを配置するディレクトリを、RAILS_ROOTからの相対パスで指定します。生成するファイル名は、template_options[:migration_file_name] で明示的に指定するか、さもなくばGeneratorの引数から自動的に決定されます。

そのほかの挙動はm.templateと同じです。 

m.dependency(generator_name, args, runtime_options = {})

Generatorの依存関係を宣言します。これによってメタジェネレータを記述する事も可能です。素晴らしいですね。

m.file(relative_source, relative_destination, file_options = {}) {|sf| ...}

ファイルのコピーを宣言します。relative_sourcerelative_destination はそれぞれRAILS_ROOTからの相対パスです。 file_optionsには、:chmod, :shebang, :collisionを指定します。 詳細な挙動については こちら を参照のこと。

ブロック引数は、relative_sourceで指定したファイルが何らかのテンプレートファイルであるときに、テンプレートを展開する処理を記述します。そうでない場合は省略可能です。

より詳細な情報が必要な場合は、 Rails::Generator::Commands::Createクラスのドキュメント 及び Createクラスの基底クラスであるRails::Generator::Commands::Baseのドキュメント をご覧ください。

更新履歴

  • 2006/08/10 マニフェストの書き方を最後の方にまとめておきました。
  • 2007/11/22 記事の移行からもれていたのでサルベージ
posted by Png genki on Thu 22 Nov 2007 at 05:10

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/178

HyperEstraier は、全文検索エンジンです。Ruby on Railsから利用する場合は、acts_as_searchableを利用すると、非常に簡単にWebサービスに検索機能を追加することができます。

今回は、HyperEstraierのP2P連携機能を使ってクラスタリングを行う手順を紹介します。

まず、クラスタリングを行う全てのPCに、 通常の手順でHyperEstraierをインストール します。パッケージマネージャを使う事もできますが、今回はソースからインストールする事にします。

インストールが済んだら、HyperEstraierを初期化して起動します。以下では、/usr/local/hyperestraier以下に環境を構築しています。

   1  # estmaster init /usr/local/hyperestraier
   2  # estmaster start -bg /usr/local/hyperestraier

起動したら、ポート1978にアクセスし、動いていることを確認します。 続いてWebインターフェイスからノード間のリンクを作成します(もちろん、あらかじめノードを作成しておく必要があります。)

リンクの作成は、ノード編集画面から行います。

例)
http://search-1.com:1978/master_ui?action=10&name=nodename

ノード編集画面の一番下のlist of linksに以下のように、「{{!}}」で区切って別なサーバのノードを登録します。

http://search-2.com:1978/node/nodename{{!}}label{{!}}1000

上記は、search-2.com上のnodenameというノードに対して、labelというラベルでリンクを作成しています。1000というのは信頼度で、検索結果の順位に影響します。1台目から2台目へのlinkの設定が済んだら、2台目から1台目に逆方向にリンクを張ります。

以上でクラスタリングは完了です。 実際に検索を行うときは、メタ検索のdepthを1以上に指定する必要があります。

This article was migrated from http://rails.office.drecom.jp/takiuchi/archive/178

posted by Png genki on Wed 11 Apr 2007 at 02:25
Contents
Generatorプラグインの作り方
HyperEstraierをクラスタリングする方法
Comments
dsjf: https://gist.github.com/6bf1bf2c3cbb5eb6e7a7 これ... '13-1
瀧内元気: おお、チェックしてみます。thx! '11-12
overisland: Reeder for iPhone もこの UI を実装していますね。 '11-12
瀧内元気: その情報は見たのですが、以下のサイトによると、現在はまた必要になってるっぽいんですよね。 ... '11-12
tkawa: http://devcenter.heroku.com/articles/rails31_he... '11-12
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ