Posted by nanki
Tue, 25 Apr 2006 14:29:00 GMT
class ApplicationController
session_times_out_in 10.minutes, :after_timeout => :do_something
end
で、10分アクセスがないとセッションが切れる。
class SomeModel
include AccessControl
で、モデルに対して、アトリビュート単位でのアクセスコントロールが可能。
let_read :login, :name, :if => true
let_access :salt, :cypher, :timezone, :role => 'admin'
- 同じくコントローラで、
include AccessControl
access_control :all, :if => false
access_control :rss, :if => :is_authorized_for_rss
access_control :view, :role => '(admin | user) & !blacklist'
access_control :create, :edit, :role => '(admin | moderator) & !blacklist'
access_control :motd do |c|
(c.some_controller_method || c.some_other_method) && (rand > 0.5)
end
とすることで、ロールベースのアクセスコントロールができてしまう。
- プラグイン機構を持っていて、
:role オプションはそれで実現されている。parser とか含んでるから、AccessControlの下に直接書くのが忍びなかったんだろうか。丁寧な作り込み。
- captcha (人間であることを確認するゆがんだ文字のやつ)
- “completely automated public Turing test to tell computers and humans apart” の略。
$ script/generate captcha config で、設定ファイル config/captcha.ymlが作られる。
- 設定ファイルにて指定したデータ,画像保存用のディレクトリをmkdir.
- model に
validates_captchaを追加。
- view のform中で、
<% c = prepare_captcha -%>
<%= captcha_hidden_field c, 'your_model' %>
<%= captcha_image_tag c %>
<%= captcha_label 'your_model', 'Type in the text from the image above' %>
<%= captcha_text_field 'your_model' %>
とすることで、captchaが使えるようになる。
- アカウント毎にサブドメインがあるような、スコープ付の認証に。
- script/generate authenticated user account で認証機能が作れる
- メール認証を使ったアクティベーションも作れる
- generator を使うので、既存のクラスに機能追加するのはできない?
module LoginEngine
config :salt, "your-salt-here"
end
Engines.start :login
という感じで設定を記述する
- engines というplugin に依存している
- 上記を設定してから、
$ rake engine_migrate ENGINE=login でDBのスキーマを変更できる。
- 最近は
$ rake db:migrate:engines ENGINE=login
- メール認証も余裕で対応!
- さらばlogin_engine
- login_engine をさらに拡張する形で、role ベースの認証を組み込める。
Engines.start :login
Engines.start :user
login_engineより後じゃなきゃダメ。
include SslRequirement
ssl_required :signup
とすると、signup が実行される時は、ssl にリダイレクトされる。
verify_form_posts_have_security_token を使うと、postされた値が正当なものかどうかチェックできる。
secure_form_tag を使ってform の中にsession id をハッシュしたトークンを埋め込んでおいて、セッション中の値と比較する、という仕組み。
- 元ネタはこちら。
- 指定したフィールド(主にpassword)の値を暗号化してくれる
- 暗号化の方式は、いくつか選べるようだ。
Posted in web, tech, ruby | Tags plugin, rails | no comments | no trackbacks
Posted by nanki
Sat, 14 Jan 2006 13:10:00 GMT
ユーザ認証をプラグインを使って作ろうと思ったんだけど、
すると、たくさんでてきてどれが何やらさっぱり。
そこでまとめてみた。
認証系
- アカウント毎にサブドメインがあるような、スコープ付の認証に。
- script/generate authenticated user account で認証機能が作れる
- メール認証を使ったアクティベーションも作れる
- generator を使うので、既存のクラスに機能追加するのはできない?
module LoginEngine
config :salt, "your-salt-here"
end
Engines.start :login
という感じで設定を記述する
- engines というplugin に依存している
- rake engine_migrate ENGINE=login でDBのスキーマを変更できる。
- メール認証も余裕で対応!
- login_engine をさらに拡張する形で、role ベースの認証を組み込める。
Engines.start :login
Engines.start :user
login_engineより後じゃなきゃダメ。
include SslRequirement
ssl_required :signup
とすると、signup が実行される時は、ssl にリダイレクトされる。
- verify_form_posts_have_security_token を使うと、postされた値が正当なものかどうかチェックできる。
- secure_form_tag を使ってform の中にsession id をハッシュしたトークンを埋め込んでおいて、セッション中の値と比較する、という仕組み。
- 元ネタはこちら。
- 指定したフィールド(主にpassword)の値を暗号化してくれる
- 暗号化の方式は、いくつか選べるようだ。
View系
- UnicodeContentType: text/html; charset=utf-8 の設定を自動で
- SafariUnicodeFix: SafariでAjaxを使う時の問題を回避
- LinkPrefetchingBlock: Google Web Accerator などがリンクを先読みするのをブロック
- <label>タグのalias
<% form_for :person, @person, :url => { :action => "update" } do |f| %>
First name: <%= f.textfield :firstname %>
<% end %>
と書くとFirst name: をラベルに変換してくれる
- Rails をRESTful にしてくれるらしい
- RailsのモデルにアクセスするためのRESTfulな?URL形式をRoutesで定義しているだけみたい
- /models/:action -> コレクションに対する操作
- /model -> 新規作成
- /model/:id -> エンティティを表示
- /model/:id/:action -> エンティティに対する操作
といった感じで、ModelsControllerにマッピングしてくれる。
<%= slider_stylesheet %>
<%= slider_field :object, :method, :range => 1..10 %>
とやると、スライダーができる。
- 多言語対応用
- <%=_ ‘yes’ %> のように参照
- 単数/複数にも対応できる
- ドキュメントは無い
- 棒グラフが生成できる
- 一ページに付き一個という制限
- この画像、ブラウザにキャッシュされては困る、というときに使う
image_tag('smiley.jpg')
=> <img src="/images/smiley.jpg?1129811151" />
と展開される。
- RJS Templates として知られるものと同じ
- サーバ側でJavascriptを動的に生成、ブラウザに実行させることができる
- アメリカ51州のセレクトボックス。
- 残念ながら日本は含まれていないので、あまり用途はない。
- rails_engineでこんなこともできるんだぞ!という例。
- production品質ではありません、と書かれている
- Flashを使ったデータ表示コンポーネント
- かっこいいデモムービー
- Flash/JavaScript間の通信ライブラリを使っているので、Railsから動作をいじれる
- doctype,stylesheet,script,metaなど、<head>の中で使いそうなものを集めました。
- formのinput系のタグに、id,class属性が自動的に付加されるようになる
- template engineをerbからliquidに変更
- .rhtml -> .liquid
- .rhtml と混在可能
- {{ item.name }} みたいな記法
- {{ item.name | upcase }} のように、パイプのような表現で出力フィルタをかけられるのが特徴的
- フォーマット付きテキストを多様するような場合は、記述がシンプルになってよさそう
- PDFWriterを使ってPDFが出力できるようになる。
- テンプレートは.rpdf 中身はrubyのコード
- アップロードの進み具合を表すバーを作る。
- requirements
- コントローラに
upload_status_for :create
という感じの記述を加えると、:createアクションでプログレスバーが使えるようになる。
開発系
- 最新のリビジョンでのテストの結果をメールで送信してくれる
- 時間がかかるようなものや、複数のアプリケーションにまたがるような変更をしたときなどに便利そう?
- Continuous integrationを実現するためのものらしい
- include ExceptionNotifiable すると、例外が発生したときに然るべき所にメールを送信してくれる
- テスト用のfixturesを今あるデータベースから生成してくれる?
- model,controllerのpublic methodに対するtest stubを自動生成してくれる。
- で使われてないview 見つけてくれる。
- 複数のJavaScriptのソースファイルを実行時にひとつにまとめてくれる
- 開発時はばらばらなので、見通しがよくなる
- まだあんまりテストされてない
migrate_ext
- rake migrate に機能を付加
- rake current_schema # 現在のバージョン番号を表示
- rake migrate_ext VERSION=-1 # 一つ前に戻す
ActiveRecord 拡張
- モデルがタグ漬けに。
- taggable.tag_with(“frog animal”)
- モデルがバージョニングに対応しちゃう
page = Page.create(:title => 'hello world!')
page.version
page.title = 'hello world'
page.save
page.version
page.title
page.revert_to(1)
page.title
こんな感じ。
- ActiveRecordが、デッドロックで失敗したトランザクションを自動的にリトライするようになる
- コードの変更は必要ない
- 今のところMySQLでのみテスト
- paranoid とは偏執狂のこと
- 削除する時に削除フラグ(ちょと違うけど)を使うようになる
- 忘れてしまいがちなフラグの指定も、普通にfind するだけで勝手に付く
- find_with_deleted で削除されたものも検索対象に
- 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
になる!?
class MyModel < ActiveRecord::Base
usesguid
...
とすると、ID(デフォルト)フィールドに22文字の、URLに使っても大丈夫なGUIDが生成されるようになる。
- システムの中でuniqueってことだよな。
- findの検索条件をキレイに書ける
Model.find_with_conditions(:all) do
year '>', 2005
name 'like', 'Foo%'
end
こんな感じ。
- 条件をCondクラスのインスタンスに保存しておけば、cond.where をActiveRecord::Base#find の条件として使える。
- Model.count にて、:include を指定した場合でも、Modelの数が数えられる(普通はjoinによって行が増える)
- paginate でも:include が使えるように
- Rails本体に取り込まれるかも(pending patch)
- 1.13.2には取り込まれてない。
その他
- 23.spell => ‘twenty-three’ とできるようになる
- 当たり前のように単数/複数に対応
- Railsのページキャッシングを拡張して、1:Post といった名前で参照できるようになっている
- 削除するときにスコープがわかりやすい?
宿題
とりあえず、script/plugin list のは無くなった。ふぅ。
参考:
Plugins in Ruby on Rails
え、まだこんなにあるの!?
こっちも。
rails2u SVN
Nowhere Near SVN
acts_as_ferret
datebox_engine
Posted in tech, ruby | Tags plugins, rails, ruby | 3 comments | 2 trackbacks