忍者ブログ
ブログツール、2007/11/06作成
[1] [2] [3] [4] [5] [6] [7] [8
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

以前のエントリで書いたけど、
select_datetimeで取得した日時のオブジェクト化。

いろいろ見てみたけど、どこでも同じ方法を採っているみたい。

こんな感じ
view
<%= select_dateitme Time.now %>

contoller
time = Time.local(params[:date][:year].to_i,
                                params[:date][:month].to_i,
                                params[:date][:day].to_i,
                                params[:date][:hour].to_i,
                                params[:date][:minute].to_i,
                                params[:date][:second].to_i)
これはあまりにスマートじゃない。

で、結局ヘルパを使いました。

def param_to_time(param)
  Time.local(param[:year].to_i,
                      param[:month].to_i,
                      param[:day].to_i,
                      param[:hour].to_i,
                      param[:minute].to_i,
                      param[:second].to_i)
end
例外処理を忘れずに。

PR
やり方は簡単、

ActiveRecord::Base.connection.execute(SQL)
で出来る。

で、ハマりどころは、ActiveRecord::Baseのクラスメソッドを直接呼ぶこと。

generate modelで作成したActiveRecord::Baseのサブクラスでこれをやると大変なことに。

class Hoge < ActiveRecrod::Base
end

Hoge.connection.execute(SQL)

とやってみると、処理はすぐに帰ってくるけれども、
状況によってはサーバーが止まる。

一寸調べてわからなかったのであきらめたけど、どうもDBとのコネクションを解放していないらしい。

DBの中身を見ると、サーバーが止まっているにもかかわらず、SQLは実行されているみたいだった。

謎だあ。
いや~はまりまくりました。

jpmobileです。
先に言っておきます。
jpmobileは何も悪くありません。
すごくいいプラグインです!!
悪いのは私です!!!!

で、何がはまったって、エンコードです。

jpmobileにはすばらしいフィルタ処理のmobile_filterが存在します。

出力時はシステムのエンコードから携帯の対応エンコードに変換、
入力時には携帯のエンコードからシステムのエンコードに変換してくれるすばらしいフィルタです。

既存のシステムを携帯対応するというのがミッションです。
で、ApplicationContorllerで携帯かどうかの判別を行い、
携帯だったら専用のコントローラに移動するという方式で進めていきました。
携帯用のコントローラにスーパークラスを設定して、そこでmobile_filterを定義、
携帯でアクセスすれば自動でエンコード変換してくれるよね~
と試してみると、これがダメ。

むむ、と思い、after_filterで強制的に出力をshift-jisにしてみると成功。

で、そのまま開発を進めます。

問題が発生したのはフォームで日本語を送ったときです。
なんかエンコードが変です。

いろいろ変換して見るもダメ。

何がどうなってるんだ~と3時間。

オチは、after_filterで強制的にshift-jisにしていたところ。

jpmobileのmobile_filterはきちんと働いていたのに、
ApplicationControllerのbefore_filterで強制的にUTF8に変換していたのが原因で、
きちんと表示されていなかった。

とほほ。

ApplicationContorllerのエンコード指定のところに、
携帯アクセスかどうかの分岐を入れて、携帯以外はUTF-8にすることで解決。

とほほ。

とほほほほほほ。

教訓
まず、自分が過去に書いたコードを疑え
select_yearとか
select_monthとか
select_dateとか
select_hourとか
select_minuteとか
select_secondとかのヘルパを使いたくなるときがある。

で、複数の日付を別々に指定したいと。
たとえば、期間を指定するのに開始年、開始月、終了年、終了月を指定するとする。
オプション無しだと、同じselect_yearとselect_monthは同じパラメータで渡っちゃうので良くない。

で、
field_nameオプションを使うわけだが、ここに落とし穴が。

view:
開始年月
<%= select_year Date.today, :field_name=>'start_year' %>
<%= select_month Date.today, :field_name=>'start_month' %>
終了年月
<%= select_year Date.today, :field_name=>'start_year' %>
<%= select_month Date.today, :field_name=>'start_month' %>

とやる。
素直に考えると、コントローラーで
params[:start_year],params[:start_month]とかで取得できそうなもんだが、
実際の所はparams[:date]のハッシュになって帰ってくる。

実際に取得するときはこう。
params[:date][:start_year]
params[:date][:start_month]
params[:date][:end_year]
params[:date][:end_month]

ちょっとはまっちゃったのでメモ。

つーか、なんで:dateのハッシュな訳?
いまいち納得いかない。:dateのハッシュ以外で取得する方法は見つからず。
むむむむ・・・・
追記

:dateのハッシュ以外で取得したいときは、
select_datetimeの:prefixオプションを使えばいい。
:discardオプションで必要ないやつを隠す。
これ、間違ってます。

正解はこちら


link_toとか、link_to_remoteとか、render_componentとかで、
配列を一発で渡したいとする。

何も考えずに出来たのでちょっと感動

@array = ['hoge', 'fuga', 'piyo']

<%= link_to 'test', :action=>'show_params', :array_param=>@array %>

params[:array_param] > ['hoge', 'fuga', 'piyo']
正解は
params[:array_param] > "hoge/fuga/piyo"

お~便利
ついめ~じ
ブログ内検索
フリーエリア
サニーカメラ
Powered by Ninja Blog    template by Temp* factory    icon by MiniaureType

忍者ブログ [PR]