ランプの中身(Ruby on Railsのシステム開発)
ランプの中身(Ruby on Railsのシステム開発)では、株式会社ケイビーエムジェイのRuby on Railsエンジニアが蓄積したノウハウを公開しています。Ruby on Railに関する技術解説や実践的なノウハウなど、開発現場の技術に則したコンテンツを随時追加していきます。 初心者の方でもわかりやすい技術解説を心がけています。リクエスト、ご質問も受け付けいますので、お気軽にコメントを記述して下さい。

< RJSを用いて、日付プルダウンメニューを... | メイン  |  DRBDのインストー... >

tnの中身(Ruby
2008.05.28

RJSを用いて、日付プルダウンメニューを書き換える (2

みなさまお元気でしょうか。谷です。

今回は前回中途半端に終わってしまった、「RJSを用いて、日付プルダウンメニューを書き換える」の修正版を公開したいと思います。

まずは、前回のコードの問題点をおさらいします。

  1. 最初から31日ない月が選択されている場合に対処できていない
  2. 複数のdatetimeカラムがあった場合など、DRY対応

それらを踏まえ、コードを若干修正してみました。

先に「複数のdatetimeカラムがあった場合など、DRY対応」について。モデル名やフィールド名はviewから渡すように変更してみました。

app/views/test_models/_form.rb(抜粋)

<p><label for="test_model_time">Time</label><br/>
<%= datetime_select 'test_model', 'time',:onChange => true %></p>
<%= observe_field 'test_model_time_1i',:submit => 'test',
:url => {:action =>'date_counter',:model_name => 'test_model',
:field_name => 'time' } %>
<%= observe_field 'test_model_time_2i',:submit => 'test',
:url => {:action =>'date_counter',:model_name => 'test_model',
:field_name => 'time'} %>

app/controllers/test_models_controller.rb(抜粋)

  def date_counter
model = params[:model_name]
field = params[:field_name]
year = params["#{model}".to_sym]["#{field}(1i)"]
month = params["#{model}".to_sym]["#{field}(2i)"]
day = params["#{model}".to_sym]["#{field}(3i)"]
day_count = Time.days_in_month(month.to_i,year.to_i)
render :update do |page|
page.replace_html "#{model}_#{field}_3i",""
(1..day_count).each do |i|
page.insert_html :bottom,"#{model}_#{field}_3i","<option value=\"#{i}\">#{i}</option>"
end
#年月を選択すると、日の選択が1に戻るのを回避。
#ただし、31日を選択した状態で2月などを選択すると、エラーが起こるのでその場合は1日を選択する
page["#{model}_#{field}_3i"].selectedIndex = (day.to_i <= day_count) ? (day.to_i - 1) : 0
end
end

次は「最初から31日ない月が選択されている場合に対処できていない」を解消します。

ページを読み込んだときに一度date_counterを実行させましょう。そのためには<body onload=〜に実行したい処理を書きます。

今回は以下のように、ヘルパにonloadメソッドを実装してみました。

app/views/layouts/test_models.rhtml(抜粋)

<body<%= onload %>>  

app/helpers/test_models_helper.rb

module TestModelsHelper
def onload
" onload=\"#{remote_function(:submit => 'test',:url => {:action =>'date_counter',:model_name => 'test_model',:field_name => 'time'})}\"" if (params[:action] == 'new' || params[:action] == 'create' || params[:action] == 'edit' || params[:action] == 'edit')
end
end

フォームを表示するページだけで実行できれば良いので、newなどのフォームを用いるアクションでのみ、onloadを返すようにしています。このあたりはもっといい書き方ができそうですね・・・。


二回にわたってRJSによる個人的な試作を紹介しました。実はこのプログラムは一度ピュアなjavascriptTで書いたことがあるのですが、RJSを使うことで記述量はかなり減っています。Railsは書けるけどjavascriptは得意でない、というかたも、作ってみたかったあれやこれがRJSにより簡単に実装できるかもしれません。是非お試しあれ。

コメント (0)  |トラックバック (0)

ブックマークに追加する

トラックバック URL

この記事にコメントする

ニックネーム:
メールアドレス:
URL:


KBMJのWebソリューション
Ruby on Rails Summer Festival 2008開催決定!!

TOPICS

2008/08/14
ZD Net Builder」の連載記事です。第七回は「Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション」が掲載されました。

2008/08/06
ZD Net Builder」の連載記事です。第六回は「Rubyでどう書く?特別編:Matzからのお題」が掲載されました。

2008/07/29
アットマーク・アイティ」にケータイWebアプリ開発、9つの注意点が掲載されました。

2008/07/11
ZD Net Builder」の連載記事です。第五回は「Rubyでどう書く?:RubyでWord文書を作成する」が掲載されました。

カテゴリ

全体のRoR最新ブログ一覧

プロフィール

  • tn
  • 新人エンジニアtnです。

    このブログでは主にRuby on Railsのプラグインの紹介をして行きます。
    開発の手助けになれば幸いです。

    ■開発環境
    OS
    ・自宅ではUbuntu on VMware on Windows XP
    ・会社ではMac OS X
    Rails
    ・1.2.5

    ブログは主に自宅で書いています。

ブログの購読

RSS

timelog
株式会社ケイビーエムジェイロゴ