Rails Plugins...

投稿者 nanki 2006-01-14 22:10:00 GMT

ユーザ認証をプラグインを使って作ろうと思ったんだけど、

$ script/plugin list

すると、たくさんでてきてどれが何やらさっぱり。 そこでまとめてみた。

認証系

account_location
  • アカウント毎にサブドメインがあるような、スコープ付の認証に。
acts_as_authenticated
  • script/generate authenticated user account で認証機能が作れる
  • メール認証を使ったアクティベーションも作れる
  • generator を使うので、既存のクラスに機能追加するのはできない?
login_engine
  • # in config/environment.rb
    module LoginEngine
    config :salt, "your-salt-here"
    end
    Engines.start :login
    という感じで設定を記述する
  • engines というplugin に依存している
  • rake engine_migrate ENGINE=login でDBのスキーマを変更できる。
  • メール認証も余裕で対応!
user_engine
  • login_engine をさらに拡張する形で、role ベースの認証を組み込める。
  • Engines.start :login
    Engines.start :user
    login_engineより後じゃなきゃダメ。
ssl_requirement
  • include SslRequirement
    ssl_required :signup 
    とすると、signup が実行される時は、ssl にリダイレクトされる。
security_extensions
  • verify_form_posts_have_security_token を使うと、postされた値が正当なものかどうかチェックできる。
  • secure_form_tag を使ってform の中にsession id をハッシュしたトークンを埋め込んでおいて、セッション中の値と比較する、という仕組み。
  • 元ネタはこちら
sentry
  • 指定したフィールド(主にpassword)の値を暗号化してくれる
  • 暗号化の方式は、いくつか選べるようだ。

View系

browser_filters
  • UnicodeContentType: text/html; charset=utf-8 の設定を自動で
  • SafariUnicodeFix: SafariでAjaxを使う時の問題を回避
  • LinkPrefetchingBlock: Google Web Accerator などがリンクを先読みするのをブロック
labeled_form_helper
  • <label>タグのalias
  • <% formfor :person, @person, :url => { :action => "update" } do |f| %>
    First name: <%= f.textfield :first_name %>
    <% end %>
    と書くとFirst name: をラベルに変換してくれる
restifarian
  • Rails をRESTful にしてくれるらしい
  • RailsのモデルにアクセスするためのRESTfulな?URL形式をRoutesで定義しているだけみたい
    • /models/:action -> コレクションに対する操作
    • /model -> 新規作成
    • /model/:id -> エンティティを表示
    • /model/:id/:action -> エンティティに対する操作 といった感じで、ModelsControllerにマッピングしてくれる。
scriptaculous_slider
  • <%= sliderstylesheet %>
    <%= sliderfield :object, :method, :range => 1..10 %>
    とやると、スライダーができる。
localization
  • 多言語対応用
  • <%=_ ‘yes’ %> のように参照
  • 単数/複数にも対応できる
css_graphs
  • ドキュメントは無い
  • 棒グラフが生成できる
  • 一ページに付き一個という制限
asset_timestamping
  • この画像、ブラウザにキャッシュされては困る、というときに使う
  • image_tag('smiley.jpg')
    => <img src="/images/smiley.jpg?1129811151" /> 
    と展開される。
javascript_generator_templates
  • RJS Templates として知られるものと同じ
  • サーバ側でJavascriptを動的に生成、ブラウザに実行させることができる
us_states
  • アメリカ51州のセレクトボックス。
  • 残念ながら日本は含まれていないので、あまり用途はない。
wiki_engine
  • rails_engineでこんなこともできるんだぞ!という例。
  • production品質ではありません、と書かれている
date_slider
  • Flashを使ったデータ表示コンポーネント
  • かっこいいデモムービー
  • Flash/JavaScript間の通信ライブラリを使っているので、Railsから動作をいじれる
head-helper
  • doctype,stylesheet,script,metaなど、<head>の中で使いそうなものを集めました。
enhanced-form-tag-helper
  • formのinput系のタグに、id,class属性が自動的に付加されるようになる
liquid
  • template engineをerbからliquidに変更
  • .rhtml -> .liquid
  • .rhtml と混在可能
  • {{ item.name }} みたいな記法
  • {{ item.name | upcase }} のように、パイプのような表現で出力フィルタをかけられるのが特徴的
  • フォーマット付きテキストを多様するような場合は、記述がシンプルになってよさそう
rails_pdf
  • PDFWriterを使ってPDFが出力できるようになる。
  • テンプレートは.rpdf 中身はrubyのコード
upload_progress
  • アップロードの進み具合を表すバーを作る。
  • requirements
  • コントローラに
    uploadstatusfor  :create
    という感じの記述を加えると、:createアクションでプログレスバーが使えるようになる。

開発系

continuous_builder
  • 最新のリビジョンでのテストの結果をメールで送信してくれる
  • 時間がかかるようなものや、複数のアプリケーションにまたがるような変更をしたときなどに便利そう?
  • Continuous integrationを実現するためのものらしい
exception_notification
  • include ExceptionNotifiable すると、例外が発生したときに然るべき所にメールを送信してくれる
ar_fixtures
  • テスト用のfixturesを今あるデータベースから生成してくれる?
engines
  • ほにゃらら_engine の親分
refactor
  • model,controllerのpublic methodに対するtest stubを自動生成してくれる。
  • rake findunusedviews
    で使われてないview 見つけてくれる。
assert_accessible
javascript-packaging
  • 複数のJavaScriptのソースファイルを実行時にひとつにまとめてくれる
  • 開発時はばらばらなので、見通しがよくなる
  • まだあんまりテストされてない
migrate_ext
  • rake migrate に機能を付加
    • rake current_schema # 現在のバージョン番号を表示
    • rake migrate_ext VERSION=-1 # 一つ前に戻す

ActiveRecord 拡張

acts_as_taggable
  • モデルがタグ漬けに。
  • taggable.tag_with(“frog animal”)
acts_as_versioned
  • モデルがバージョニングに対応しちゃう
  • page = Page.create(:title => 'hello world!')
    page.version       # => 1
    page.title = 'hello world'
    page.save
    page.version       # => 2
    page.title         # => 'hello world'
    page.revert_to(1)
    page.title         # => 'hello world!'
    こんな感じ。
deadlock_retry
  • ActiveRecordが、デッドロックで失敗したトランザクションを自動的にリトライするようになる
  • コードの変更は必要ない
  • 今のところMySQLでのみテスト
acts_as_paranoid
  • paranoid とは偏執狂のこと
  • 削除する時に削除フラグ(ちょと違うけど)を使うようになる
  • 忘れてしまいがちなフラグの指定も、普通にfind するだけで勝手に付く
  • find_with_deleted で削除されたものも検索対象に
calculations
  • group by を使った構文が書ける
  • User.calculate(:count) といった感じ
  • たぶん、:max, :min などもあるだろうな。
  • Order.calculate(:sum, :cost).group_by(:country).having { |sum| sum > 50 }
    SELECT country, SUM(cost) FROM orders GROUP BY country HAVING SUM(cost) > 50
    になる!?
guid
  • class MyModel < ActiveRecord::Base
    usesguid
    ...
    とすると、ID(デフォルト)フィールドに22文字の、URLに使っても大丈夫なGUIDが生成されるようになる。
  • システムの中でuniqueってことだよな。
where
  • findの検索条件をキレイに書ける
  • Model.findwithconditions(:all) do
    year '>', 2005
    name 'like', 'Foo%'
    end
    こんな感じ。
  • 条件をCondクラスのインスタンスに保存しておけば、cond.where をActiveRecord::Base#find の条件として使える。
count_limit_associations
  • Model.count にて、:include を指定した場合でも、Modelの数が数えられる(普通はjoinによって行が増える)
  • paginate でも:include が使えるように
  • Rails本体に取り込まれるかも(pending patch)
  • 1.13.2には取り込まれてない。

その他

numeric_spell
  • 23.spell => ‘twenty-three’ とできるようになる
  • 当たり前のように単数/複数に対応
referenced_page_caching
  • Railsのページキャッシングを拡張して、1:Post といった名前で参照できるようになっている
  • 削除するときにスコープがわかりやすい?
foo_with_install
  • 騙された!?中身ないじゃん

宿題

とりあえず、script/plugin list のは無くなった。ふぅ。

参考:

Plugins in Ruby on Rails え、まだこんなにあるの!?

こっちも。 rails2u SVN Nowhere Near SVN

actsasferret

datebox_engine


SwitchTower インストール

投稿者 nanki 2006-01-09 18:21:00 GMT

もう二ヶ月近くほったらかしてたSwitchTowerをインストールしてみた。

$ sudo gem install switchtower
...
$ switchtower --apply-to ../rails_app
      exists  config
      create  config/deploy.rb
      exists  lib/tasks
      create  lib/tasks/switchtower.rake

ふむふむ。

config/deploy.rb に設定がたくさんあって、lib/tasks/switchtower.rake にはrake のタスクの記述がある。

さあ、早速使うぞと思いきや、まだデプロイ先がないんだった・・・


MSNP

投稿者 nanki 2005-12-30 06:55:00 GMT

IMをフロントエンドにして何かできないか、と思ったのでJabber,Gaimあたりを調べてみた。 その途中で、rubyでMSNPを実装したものを発見。 これが太い脇道だった。

最近、検索によくひっかかる、ゼロベース有限会社の人が書いたもののようだ。

使ってみたが、なかなか使いやすい。

require 'msnm'

#class TestSessionHandler
#...(snip)...
#class TestSessionHandlerFactory
#...(snip)...

begin
  msnm = Net::InstantMessaging::MSNMessenger.new(
           '***@hotmail.com','***', 
           TestSessionHandlerFactory.new )
  msnm.ns.synchronize
  msnm.listen
ensure
  msnm.ns.offline
  msnm.logout
end

SessionHandler と、それを生成するFactory をセットで実装して、MSNMessenger.new するだけでよい。

肝心の応用の方だけど、ピンとくる使い方はまだ思いつかない。

参考:

IMボット用Rubyスクリプト

MSNPiki


Try Ruby

投稿者 nanki 2005-11-29 09:26:00 GMT

Try Ruby

すごい・・・すごい・・・

すごいなこれ。

ところで、babieさんを参考にプチメモ生活が始まった今日この頃、机の上の紙に「ホワイトボードの余白」と書いてある。

なんのことだろう?

ものすごく眠いときにメモしたものなので、記憶に無い。

ホワイトボードの余白にGoogle広告でも出すつもりだったんだろうか。

参考:

遅レス。


rails generatorsの位置

投稿者 nanki 2005-11-27 07:20:00 GMT

script/generate のヘルプによると、 ”#{RAILS_ROOT}/generators/[a-z]*” でいいらしいけど、ソースコードを追ったら

"#{RAILS_ROOT}/lib/generators/[a-z]*"
"#{RAILS_ROOT}/vendor/plugins/**/generators/[a-z]*"
"~/.rails/generators/[a-z]*"

の三つが対象みたい。


Rails 新機能

投稿者 nanki 2005-11-19 18:46:00 GMT

つい先日、Rails1.0 RC4 がでたので、気になる点を(今回の新機能に限らず)ピックアップしようとおもったけど、数が少ないので随時追加予定。

  • redirect_to :back
  • has_many …, :include => …
  • encoding option

Rails 勉強会@関西 第0回

投稿者 nanki 2005-11-13 02:18:00 GMT

Rails 勉強会@関西 第0回 に参加してきた。

今回は、babieさんの取り計らいで「ポジションペーパー」方式が導入され、自己紹介がスムーズに。

これはいい。自己紹介だけじゃなくて、十数人くらいの単位で何か議論する際に、固定的なメディアである紙の上に各自のスタンスを述べることで、議論すべきポイントが明確になりそうだ。 今回の勉強会は、Rails 以外にも、こういう点で期待している。

で、自己紹介も終わり、勉強会の方針について決める。→ 議事録

京都の勉強会が存続してよかった。

休憩をはさんで、moriq さんのajax 講座。 observer 以外はちょうど使ったばかりなのでタイムリー。

ストヤンさんが、会社でのサーバ構成、デプロイ環境を発表して勉強会は終わり。

部屋を片付け、懇親会へ。

懇親会では、babieさん、高木さんに挟まれ、向かいにはcuzicさんという恵まれた環境で、rails話で盛り上がったりした。

高木さんは、すでにかなりAWDwR を読み倒している感じで、何か言うと「ああそれは、320ページくらいに書いてあった」といって周りを驚きの渦に。 ピンと言えばポンというテンポのいいレスポンスはこういう集まりならでは。

ページごとにキーワードをメモっておくのはいいな。 是非取り入れたいけど、本に書き込むのは気が引ける。

これ以上書くと日記になってしまうのでこの辺でやめ。


Enterprise Ruby.

投稿者 nanki 2005-11-12 15:47:00 GMT

Rails勉強会@大阪にて。 開発、デプロイ環境の話を、silver egg のストヤンさんがアドリブ講演。

要するに、効率のいい開発環境、デプロイ環境、運用環境、という話。

web サーバとして、lighttpd を動かし、lighttpd の機能でmod_rewrite のreverse proxy みたいにして、裏にいる各サービス単体で動くマシンに繋ぐというやりかた。

  • 複数のマシンでfcgi を直接起動(supervise で死ねない体)
  • 複数のOSでの開発
  • サービスの拡張

などが楽になる。

また、SwitchTower(gem にあり)を使う事で、迅速で柔軟なdeployが可能になっている。

rakeで、deploy,rollback などができるらしい。


agiledox with rails

投稿者 nanki 2005-11-06 17:50:00 GMT

rails のwiki を眺めていたら、こんなページ(TDDinRails)を発見。(見つけるの遅い)

この中で、rails のrake に agiledox 風の機能を追加するという小技が紹介されている。 要は、テストクラスのメソッド名を説明的に書いて(test_should….)、テストを書くと同時にクラスの仕様のリストまで作成してしまおう、というやり方のようだ。

task :agiledox do
  tests = FileList['test/**/*_test.rb']
  tests.each do |file|
    m = %r".*/([^/].*)_test.rb".match(file)
    puts m[1]+" should:\n"
    test_definitions = File::readlines(file).select {|line| line =~ /.*def test.*/}
    test_definitions.each do |definition|
      m = %r"test_(should_)?(.*)".match(definition)
      puts " - "+m[2].gsub(/_/," ")
    end
    puts "\n"
  end
end

の様なコードをRakefile に追加することで、

$ rake agiledox
user_controller should:
 - store user in session on successful login
 - not store user in session on unsuccessful login
...

という使い方ができるようになる。 テストに失敗しても、メソッド名から何がどう失敗しているかがわかりやすいし、TODO 管理の様にも使える。

なるほど、これならテスト駆動開発が楽しいものになりそうだ、と心の中でわくわくした。

さらに、ruby ではメソッド名に日本語が使えるので、

def test_ログインに成功したらsessionにuserが保存される。
...
end

ともできる。

これは良さそうということで、早速後輩に勧めたら、テストコードが書きたくてしょうがなくなったようだ。 テスト駆動開発定着までの近道として参考になる。

参考


実行時にtemplateを切り替える

投稿者 nanki 2005-10-14 06:44:00 GMT

ユーザの権限などで、使用するテンプレートセットを変えたい場合、ActionController の中で、

class ApplicationController < ActionController::Base
  before_filter :authorize

  private
  def authorize
    return unless @member.guest?
    template_root = "#{RAILS_ROOT}/app/views/guest/"
    @template.base_path = template_root
  end
end

とやればいいみたい。

参考:

changing your ActionController template_root per request