IBM 境界を越える: Rails での拡張 – Japan
acts_as プラグインを解剖する
[ref.] acts_as_state_machine (記事にあるURLはすでに存在しないので)
プラグインの勉強にと、カヤックの人の記事を参考におみくじプラグインを作ってみました。
モデルにfortuneというアトリビュートがあれば、saveするときに勝手に運勢を突っ込みます。ただそれだけです。
こんな感じ。
>> boy = Person.new(:name => 'Keiichi')
>> puts boy.name, boy.fortune
Keiichi
nil
>> boy.save
>> puts boy.name, boy.fortune
Keiichi
小吉
詳細は以下の通り。
主要なファイル
vendor/plugins/acts_as_fortuned/init.rb
require 'acts_as_fortuned'
ActiveRecord::Base.class_eval do
include SaikyoLine::Acts::Fortuned
end
vendor/plugins/acts_as_fortuned/lib/acts_as_fortuned.rb
module SaikyoLine
module Acts
module Fortuned
def self.included(base)
base.extend ActMethods
end
module ActMethods
def acts_as_fortuned
self.extend ClassMethods
self.instance_eval {include InstanceMethods}
before_save :cast
end
end
module ClassMethods
# No methods defined in here.
end
module InstanceMethods
def cast
if self.respond_to? 'fortune='
fortunes = %w(大吉 吉 中吉 小吉 凶)
self.fortune = fortunes[rand(fortunes.length)]
end
end
end
end
end
end
使い方
db/migrate/001_create_people.rb
class CreatePeople < ActiveRecord::Migration
def self.up
create_table :people do |t|
t.column :name, :string
t.column :fortune, :string
end
end
def self.down
drop_table :people
end
end
app/models/person.rb
class Person < ActiveRecord::Base
acts_as_fortuned
end
きっと更新しないのでソースはtarボールで置きます。
つ acts_as_fortuned.tar.gz