SelectableAttrRails
Introduction
selectable_attr_railsは、selectable_attrをRailsで使うときに便利なヘルパーメソッドを提供し、 エントリをDBから取得したり、I18n対応するものです。 github.com/akm/selectable_attr_rails/tree/master
selectable_attr は、コードが割り振られるような特定の属性について*コード*、*プログラム上での名前*、 *表示するための名前*などをまとめて管理するものです。 github.com/akm/selectable_attr/tree/master
Install
1. Railsプロジェクトで使う場合
a. plugin install
ruby script/plugin install git://github.com/akm/selectable_attr.git
ruby script/plugin install git://github.com/akm/selectable_attr_rails.git
b. gem install
[sudo] gem install akimatter-selectable_attr akimatter-selectable_attr_rails -s http://gems.github .com
チュートリアル
selectヘルパーメソッド
以下のようなモデルが定義してあった場合
class Person < ActiveRecord::Base
include ::SelectableAttr::Base
selectable_attr :gender do
entry '1', :male, '男性'
entry '2', :female, '女性'
entry '9', :other, 'その他'
end
end
ビューでは以下のように選択肢を表示することができます。
<% form_for(:person) do |f| %>
<%= f.select :gender %>
<% end %>
form_for、fields_forを使用しない場合でも、オブジェクト名を設定して使用可能です。
<%= select :person, :gender %>
また以下のように複数の値を取りうる場合にもこのメソドを使用することが可能です。
class RoomSearch
include ::SelectableAttr::Base
multi_selectable_attr :room_type do
entry '01', :single, 'シングル'
entry '02', :twin, 'ツイン'
entry '03', :double, 'ダブル'
entry '04', :triple, 'トリプル'
end
end
<% form_for(:room_search) do |f| %>
<%= f.select :room_type %>
<% end %>
この場合、出力されるselectタグのmultiple属性が設定されます。
radio_button_groupヘルパーメソッド
一つだけ値を選択するUIの場合、selectメソッドではなく<input type="radio".../>を出力することも可能です。
上記Personモデルの場合
<% form_for(:person) do |f| %>
<%= f.radio_button_group :gender %>
<% end %>
この場合、<input type="radio" .../><label for="xxx">... という風に続けて出力されるので、改行などを出力したい場合は
引数を一つ取るブロックを渡して以下のように記述します。
<% form_for(:person) do |f| %>
<% f.radio_button_group :gender do |b| %>
<% b.each do %>
<%= b.radio_button %>
<%= b.label %>
<br/>
<% end %>
<% end %>
<% end %>
f.radio_button_groupを呼び出しているERBのタグが、<%= %>から<% %>に変わっていることにご注意ください。
check_box_groupヘルパーメソッド
複数の値を選択するUIの場合、selectメソッドではなく<input type="checkbox".../>を出力することも可能です。
上記RoomSearchクラスの場合
<% form_for(:room_search) do |f| %>
<%= f.check_box_group :room_type %>
<% end %>
この場合、<input type="checkbox" .../><label for="xxx">... という風に続けて出力されるので、改行などを出力したい場合は
引数を一つ取るブロックを渡して以下のように記述します。
<% form_for(:person) do |f| %>
<% f.check_box_group :gender do |b| %>
<% b.each do %>
<%= b.check_box %>
<%= b.label %>
<br/>
<% end %>
<% end %>
<% end %>
f.check_box_groupを呼び出しているERBのタグが、<%= %>から<% %>に変わっていることにご注意ください。
DBからのエントリの更新/追加
各エントリの名称を実行時に変更したり、項目を追加することが可能です。
class RoomPlan < ActiveRecord::Base
include ::SelectableAttr::Base
selectable_attr :room_type do
update_by "select room_type, name from room_types"
entry '01', :single, 'シングル'
entry '02', :twin, 'ツイン'
entry '03', :double, 'ダブル'
entry '04', :triple, 'トリプル'
end
end
というモデルと
create_table "room_types" do |t|
t.string "room_type", :limit => 2
t.string "name", :limit => 20
end
というマイグレーションで作成されるテーブルがあったとします。
エントリの追加
room_typeが“05”、nameが“4ベッド”というレコードがINSERTされた後、 RoomPlan#room_type_optionsなどのselectable_attrが提供するメソッドで 各エントリへアクセスすると、update_byで指定されたSELECT文が実行され、 エントリとしては、
entry '05', :entry_05, '4ベッド'
が定義されている状態と同じようになります。
このようにコードで定義されていないエントリは、DELETEされると、エントリもなくなります。
エントリの名称の更新
実行時に名称を変えたい場合には、そのidに該当するレコードを追加/更新します。 例えば、 room_typeが“04”、nameが“3ベッド”というレコードがINSERTされると、その後は 04のエントリはの名称は“3ベッド”に変わり、また別の名称にUPDATEすると、それに よってエントリの名称も変わります。
このようにコードによってエントリが定義されている場合は、DELETEされてもエントリは削除されず、 DELETE後は、名称が元に戻ります。
I18n対応
エントリのロケールにおける名称をRails2.2からの機能である、I18nを内部的にしようして取得できます。
上記RoomPlanモデルの場合、
config/locales/ja.yml ja:
selectable_attrs:
room_types:
single: シングル
twin: ツイン
double: ダブル
triple: トリプル
config/locales/en.yml en:
selectable_attrs:
room_types:
single: Single
twin: Twin
double: Double
triple: Triple
というYAMLを用意した上で、モデルを以下のように記述します。
class RoomPlan < ActiveRecord::Base
include ::SelectableAttr::Base
selectable_attr :room_type do
i18n_scope(:selectable_attrs, :room_types)
entry '01', :single, 'シングル'
entry '02', :twin, 'ツイン'
entry '03', :double, 'ダブル'
entry '04', :triple, 'トリプル'
end
end
これで、I18n.localeに設定されているロケールに従って各エントリの名称が変わります。
Credit
Copyright © 2008 Takeshi AKIMA, released under the MIT lice nse