= SelectableAttrRails

== Introduction
selectable_attr_railsは、selectable_attrをRailsで使うときに便利なヘルパーメソッドを提供し、
エントリをDBから取得したり、I18n対応するものです。
http://github.com/akm/selectable_attr_rails/tree/master

selectable_attr は、コードが割り振られるような特定の属性について*コード*、*プログラム上での名前*、
*表示するための名前*などをまとめて管理するものです。
http://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 (c) 2008 Takeshi AKIMA, released under the MIT lice nse