« 装填完了 | トップページ | PC-BSD 1.3 »

学習RoR(13) observe_field

 新規や編集などでドロップダウンリストでの入力をいくつか使っているのだけれど、条件によってその内容を切り替えたいと思っていた。基本となる書名などを扱う item フォームで大まかな種別(雑誌とか単行本とか)を選択したら、それに応じて個々の版刷りの edition フォームでの選択肢を表示するといった感じ。

 版刷りの追加であれば、そのときの item の種別を示す item.kind の値によって処理すればよいけれど、新規の場合にはフォームで選択されてはじめて処理されるわけで、となると observe_field かなと試行錯誤。

new.rhtml の _item_form.rhtml を render した後に、
<%= observe_field("item[kind]", {:update => :edition_kind_new, :url => {:action => 'edition_kind_field'}, :on => "changed", :submit => :item_kind_select}) %>
を追加。
(07/03/13追記: field_id の指定が間違っているので、"item[kind]" を "item_kind" と読み替えること。詳細は(16) (17) を参照)

_edition_form.rhtml に update 位置として
<span id='edition_kind_new'>
</span>
を追加。

item_controller.rb に、
def edition_kind_field
 render :partial => 'edition_kind', :locals => {:item_kind => params[:item][:kind]}
end
を追加。

render される切り替えフォームとして、_edition_kind.rhtml を作成。
<p><label for="edition_kind"><%=h _('kind') %></label>
<%
 case item_kind
 when "雑誌"
%>
  <%= select :edition, :kind, %w(本誌 本誌+ 付録 別冊 増刊 ファイル) %>
<%
 else
%>
  <%= text_field :edition, :kind %>
<%
 end
%>
</p>
こんな感じで必要な分の when 節を。

 という感じでなんとか動作はしている様子。

 最後の切り替え用のフォーム _edition_kind.rhtml はちょっとスマートではないようにも思うのだけれど、もっとうまいやり方があるだろうか。

 ちなみに同様の方法で、「雑誌」の場合には号数の入力欄を表示するようにもしてみた。RDoc をずいぶんあちこち見ながらなんとかこんな感じには出来た。

(14)につづく


Rails のお薦め本

|

« 装填完了 | トップページ | PC-BSD 1.3 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 学習RoR(13) observe_field:

« 装填完了 | トップページ | PC-BSD 1.3 »