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

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

いや~はまりまくりました。

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にすることで解決。

とほほ。

とほほほほほほ。

教訓
まず、自分が過去に書いたコードを疑え
PR
ただいま携帯電話用のwebアプリ作成中

当然ログイン処理とか、それ以外にもフォーム入力をさせることが多々あるわけだけど、
携帯の文字モード切替は使いにくい!

というわけでフォームに合わせて入力モードを切り替えられるようにしてほしいとのこと。

おっしゃること、ごもっとも。

で、調べた。

inputの属性に以下を設定すればOKらしい。

全角ひらがな:istyle="1" mode="hiragana"
全角カタカナ:mode="katakana"
半角かな:istyle="2" mode="hankakukana"
英字:istyle="3" mode="alphabet"
数字:istyle="4" mode="numeric"

istyleはドコモとAU、modeはソフトバンク用。
全角カタカナはソフトバンクのみ対応。

AUはformat属性でもっと細かく設定できる。

A:英大文字のみ(句読点可)
a:英小文字のみ(句読点可)
N:数字のみ
X:大文字と数字記号(句読点・記号可)
x:英小文字と数字記号 (句読点・記号可)
M:全角漢字 (携帯のボタンですべての文字可)
m:英小文字 (携帯のボタンですべての文字可)
formatの中身はダブルクォーテーションでくくって指定。

英字の前に数字をつけることで文字数制限も出来るらしい。
文字数制限したくないときはアスタリスクを前につける。
こっちはどうやら入力そのものを制限するようで、
自分で文字モードの切り替えが出来なくなるみたい。

AUユーザーじゃないのでわからないけど。

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オプションで必要ないやつを隠す。
ActiveRecordを使って大量のデータをSAVEすることに。

CSVからデータを読み込んで一行ずつ分析してデータを投入したんだけど、
これが非常に遅い。

CSVの読み出しにはFasterCSVを利用しているので、
こっちの方は遅くない。

約600件のレコードを作るCSVを流し込んでみて、
データを作成しないで行をチェックするだけのメソッドでは、
レンダリングも含めて0.2秒。
データを投入する方では、なんと143秒もかかってる。
(Developmentモード)

ログを見てみると、一つのレコードに対してinsertとupdateが1回ずつ走ってる。
なんで?

やっていることは、
CSVの解析ループで1セル毎に一つオブジェクトをnewして配列に追加、
(このときSAVEはしない。CREATEでもない)
ループ終わり配列をループで回して、
関連オブジェクトのIDを入力してからSAVEをしているだけ。
SAVEは1回しかしてないのに。

最終的には1万レコードの追加が普通になりそうなので、
ちょっと気が遠くなってきた。

件数が多いのでちょっとしたチューニングでも結構大きな差になりそうなのに。
なんかいいちえないですかねえ。
これ、間違ってます。

正解はこちら


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]