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

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

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で改めてアクション呼ぶのがいいのかしらん。


PR
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で配列に戻せる。

なかなか面倒です。

今回のハマりはARのacts_as_listです。
今までARにacts_as_listなんて便利なものがあるのをすっかり忘れていて、
車輪の再発明しまくりだったわけですが、
改めてアジャイル本をめくっていて、こんなのがあるのに気づき、
あ~、トホホ、という感じでこれを使うことに。

今までは、表示順を:display_orderでやってたので、
テーブル設定を変えたくないのでそのままのオーダーでacts_as_listでやろうと。

普通に実装するときは、表示順を表すカラムをpositionにしてあげれば、
後はARが勝手にやってくれる。

違うカラムを指定したいときは、:columnオプションでシンボル指定してやってください。

こんな感じ


has_many :childlen, :order=>:oreore_position


belongs_to :parent
acts_as_list :scope=>:parent_id, :column=>:oreore_position

これで、oreore_positionをキーに整列してくれる。

#2.0からオプション扱いになって、本家ドキュメントに載ってないよ~。

あ~やられてしまった。

う~

前に書いたエントリで、
パラメータを配列のハッシュだとか、
ハッシュのハッシュだとか、
ハッシュの配列だとかに入れられると書いたんだけど、
これが、2段以上のハッシュに対応していないことが判明。

こんな感じで送る

<%= hidden_field_tag 'hoge[]fuga][piyo]', value1 %>
<%= hidden_field_tag 'hoge[]fuga][piyo]', value2 %>
これを期待
params[:hoge]  -> [{:fuga=>{:piyo=>value1}}, :fuga=>{:piyo=>value2}}]
結果
params[:hoge] -. [:fuga=>{}, :fuga=>{}]

あ~、なんかいい知恵は無いものか。

あ~、やっちゃいましたよ。

link_to の:popupオプションです。

自分で、:popupオプションの記事を書いておいて、
それを参考して使ったらちっともポップアップしない。

ひどいもんです。

あのとき、こう書いた。読みやすいと思って。
<%= link_to 'hoge',
            :action=>hoge,
            :popup=>['new_window',
                        'width=500,
                         height=300,
                         menubar=no,
                         toolbar=no,
                         location=no,
                         scrollbars=yes,
                         resizable=yes'] %>
そこに大きなハマりポイントが!

:popupオブションの中身は改行したらいけません。
絶対ダメです。

ポップアップしなくなります。

あ~。これで30分無駄に・・・
ついめ~じ
ブログ内検索
フリーエリア
サニーカメラ
Powered by Ninja Blog    template by Temp* factory    icon by MiniaureType

忍者ブログ [PR]