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

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

忘れちゃうのでメモ。

普通にRailsのプロジェクトを作成すると、
public/index.htmlが作成されて、
ドメイン直下にアクセスしたとき(http://www.hoge.jp/とか)にそれが表示される。

状況によっては、いきなり動的なページを表示したいときとかがある。
(というか、その方が多いかも)

どうするか。
config/routes.rbにパスの解釈とかの設定を書けるので、そこに書く。
(というか、コメントアウトしてちょっと書き換える。)

# map.connect '', :controller => "welcome"
の行。

map.connectの第一引数は、解釈させたい設定。
第二引数があると、第一引数のアクセスに対しての変更を設定できる。

上記のコメントを外してやると、
http:hoge.jp/にアクセスしたとき、
http:hoge.jp/welcome/にアクセスしたのと同等になる。

つまり、welcomeコントローラーの indexアクションが呼ばれると言うこと。

あ、あと、public/index.htmlの方がプライオリティが高いので、
必ず削除しておく必要があります。
PR
またはまってしまった。

はまったのは、link_to_remoteの:afterオプション。

データをまとめて投入するために、CSVファイルとかをアップさせて、
それを利用してデータ投入したいときとかがある。

出来ればチェックを行っておいて、
それでOKならデータ投入、等の操作をしたいとする。

そんなとき、普通にフォームだけで最後まで突き進もうとしたとき、
あまりにファイルが大きすぎるとか、
チェック操作やデータ投入操作が冗長で時間がかかったりすることはままある。

で、(パフォーマンスチューニングして何とかしろ、というのはおいといて)
タイムアウトを避けたり、あ~、これ、動いてんのかな~?
というユーザーの疑惑の目を避けるため、
ひとまず、ファイルを受け付けたよ、というページに遷移してから、
更にチェックなり、データ投入なりをする操作をしてもらうようにしようと。

そのときに、link_to_remoteでページを部分的に遷移させ、
:afterオプションで処理中の画面を描画する。

処理中の画面は、単なるテキストでもいいんだけど、せっかくだから
アニメGIFを使って処理中のものを見せようと。

というわけで、処理中のページを作成して、
:afterオプションの中でrender :partialして見せる。
呼び出し側はこんな感じ

<%= link_to_remote "時間のかかる処理", :update=>'update_column',
                                   :submit=>'params_column',
                                   :after=>"Element.update('update_column','#{render :partial=>'processing_page'}')",
                                   :url=>{:controller=>'hoge',
                                          :action=>'fuga'} %>

で、やってみたら全然ページが切り替わらない。
Javascriptのエラーみたい。

いろいろタイプミスや、オプションの順番とかを調べて見るも、全くわからない。

で、FireBugでソースを見てみてふと気づいた。
render :partialで描画されるページの中身って、Javascriptのパラメータにそのまま入ってる。

そうです。
render :partialするページで改行してはダメだったんですねえ。

教訓:

Javascriptの中に展開される可能性のある部分では、
改行は一切禁止

ということでした。
render_componentですよ。

render_componentrequest.xhr?
trueないことがあるということ。

つまり、render_componentで呼び出されたアクションのレンダリングについて、
レイアウトを考慮するかしないかの判断がつけられない、
ということです。

そんなもん決めうちにしとけばええやん、と思うかもしれませんが、
起きた現象というのは(てか、とっくにおきてたんだけど気がつかなかった)
こんなかんじ

多機能なWEBアプリを作っておいて、
いろんな機能のサマリーとかをポータルに配置したい、とか思うと、
render_componentは非常に便利。

というわけで、機能毎にコントローラを分けて、
ポータルからはrender_componentで内容を表示させる。

大量のrender_componentが呼ばれると、
ポータルの表示が遅くなる欠点は確かに否めないけれど、
その辺のコードは全て機能側に集約できるので、
ポータルの方はレイアウトとか、そういうのに集中できて助かる。

で、本来は表示できない(権限を細かく分けているので権限外)な
コンポーネントを表示したときに、
「みれれません」ページを表示したいとする。

権限処理は全て機能に集約しているので、
機能側のコントローラで判別したい。

となれば、before_filterで権限判定を行って、
ダメなら「みれれません」ページをレンダリングするのが普通。

どの機能にも同じような処理があれば、
権限判定は機能側コントローラでやって、「みれれません」ページのレンダリング処理は
AppricationControllerに配置するのが吉。

しかも、Ajaxアクセスか、普通のアクセスかでレイアウトを考慮しなければならないなら、
request.xhr?でrender :actionか:partialを選んであげればいい。

普通にリクエストを発してきたアクセスに関しては、
フォーム経由だろうが、link_toだろうが、link_to_remoteだろうがどんと来い状態。
しかし、render_componentの時は、request.xhr?常にtrueじゃないので、
使えない。

どういう事かというと、
render_componentは呼び出し元リクエスト
(つまり、render_componentを記述しているrhmlファイルとかを呼び出したリクエスト)
のrequestを元に、新しいrequestを生成して対象のアクションを呼び出している。
このため、render_componentのrequest.xhr?は
呼び出し元リクエストのrequest.xhr?と同じものを返してきてしまう。

つーか、render_componentって、非同期呼び出し以外で利用されんのか?
という疑問が。

気がつけばrails2.2では非推奨になってるし。

なんか別の方法を考えないとね。
出来ればそれぞれ別のタイミングでレンダリング処理してほしいから、
やっぱりJavascriptで改めてアクション呼ぶのがいいのかしらん。


自社のASPサービスで携帯版を作り、動作させているんだけど、
機能強化と称していろいろ手を加えた。

で、本番サーバーにいきなりデプロイは危険なので、
とりあえず不安定版を動作させている自社サーバー
(単なるPCを事務所において、ルーターのポートフォワードで動作させているMongrelサーバー)
にデプロイ。

PCで検証して、無事動作しているのを確認。

お~、い~ね~。
と思いつつ、携帯で検証すると、割とレスポンスのいい、
ログイン前までの処理は普通に動作するんだけど、
ちょっとしたDBチェックがかかったりするページに遷移するとエラーが返ってくる。

むむ?携帯に関係するところのコードにバグを仕込んだかな?
と思いつつ、ログを確かめてみると、
きちんとレンダリングが終わっているとの表示。

????
いったい何が?と思いながら、ログを残しながら動作させると、きちんと動いてる。
むむ~と思って、フロントエンドにおいているApache
(リバースプロクシで後ろに立ってる複数のMongrelに回してる)
のログを見るも、これも大丈夫。

正常動作してる本番サーバーのソースと見比べて見るも、
返答が無くなっている所まで通過するコードに違いはない。

携帯のエラー画面を見ると、(WJ46147E)のエラーコードが。

エラーコードで検索してみると、
ここに答えが。

なんだよ~。と思いつつ、ルータのMTUを変更すると、
あっさり通りましたとさ。

しかし、検索結果で解決してるサイトはこのトラバ元と、このトラバ元を引用しているサイトの
2件だけだったことを考えると、
このトラバ元が無ければたぶん後数日は悩んでいたと思われ・・・・

((((;゚Д゚))))ガクガクブルブル

トラバ元のIRIEWEBさん、ありがとう!!!


link_toやlink_to_remote、っていうか、
url_forにハッシュをつけることで、パラメータを渡せることは周知の事なんだけど、これに配列を渡せないか、
というのが今回のお題。

前に書いたエントリは真っ赤な嘘でした。ごめんなさい

フォームヘルパ系のパラメータであれば、
パラメータ名に[]をつけてやれば配列で渡せるのは
このエントリで書いたとおり。

が、前に書いたエントリのように、
<%= link_to 'hoge', :controller=>'hoge', :action=>'fuga', :piyo=>['hoge','fuga','piyo'] %>
なんてやっても、
params[:piyo]は配列で帰ってきてくれない。

で、どうなっているかと言えば、
配列を.join('/')で処理したのと同じものがパラメータに入ってくる。
上の例でいうと、
params[:piyo] > "hoge/fuga/piyo"
という感じ。

で、配列で取得したいときは、単純にsplit('/')すればいい。

ただ、気をつけたいのは[/]をエスケープしてくれないこと。
たとえば、
:hoge=>['ho/ge', 'fu/ga', 'pi/yo']
で渡すと、パラメータは
"ho/ge/fu/ga/pi/yo"ではいってきちゃう。

この条件さえクリアすれば、普通にsplitで配列に戻せる。

なかなか面倒です。

前のページ      次のページ
ついめ~じ
ブログ内検索
フリーエリア
サニーカメラ
Powered by Ninja Blog    template by Temp* factory    icon by MiniaureType

忍者ブログ [PR]