モーダルウィンドウを使いたいっす。

サイトの中でウィンドウっぽいものを表示させたくなった。(Railsの検索結果を開いて、戻る時の行動が面倒な気がしていた)
 
この動作を行うときの適切なキーワードが判らなくて悩んだ。(「もやーん」と出てくるウィンドウみたいなアレ・・・ってなキーワードでしか同僚に説明出来なかった・・・orz)
 
「フローティングウィンドウ」「モーダルウィンドウ」とか言うらしい。
 
Javascriptでゴリゴリ書くサイトは直ぐに見つかるけど、Railsのエレガントな記述をしているところを探すと・・・あった。

篳篥日記 Railsでモーダルを開く(基礎編)
ここを参考にしながら作ってみる。

ダウンロード
  • LIVEPIPE Download & Contributeから「Download Latest Tarball」をクリック
  • GZファイルが落ちてきたので展開
  • srcの中「livepipe.js」と「windows.js」をコピー
  • C:\Users\kenmituo\Documents\Aptana Studio\roommgr\public\javascripts\livepipe-uiに貼り付け

 

ヘルパを作る
次に、モーダルを一つ開くたびにJavaScriptを書くのは面倒なので、ヘルパを作っておく。

参考にするきっかけになったのがこの一文。面倒なのは嫌いなんだけど、最初の苦労は厭わないって感じる。(崇拝しすぎているか?)
 
と、賞賛してからコピペさせてもらう。
Supportフォルダの中に入っているので
「module ModalHelper」を
「module Support::ModalHelper」と書き換える

 
このヘルパーは使い回しを予定している
iftbというヘルパーでインクルードする

module Support::IftbHelper
  include Support::ModalHelper
コントローラ
  def modal_open
    render :partial => 'support/iftb/andy/modal'
  end

サブフォルダに格納しているから。
 

スタイルシート

既存のファイルにコピペ!
 

スクリプトファイルの読み込み

views/layoutsを使っているので流し込む。
 
んで、試したところビューからコントローラにIDを渡せない・・・
ヘルパーを改造

module Support::ModalHelper
  def modal_link_to(label, options={}, html_options={})
    options.update({ :id=>html_options[:id]})
    html_options[:id] ||= 'modal_id'
    return link_to(label, options, html_options)
  end

 
んで、コントローラも改造

class Support::IftbController < ApplicationController
  def modal_open
    @f = Iftb.find(params[:id])
    render :partial=> "support/iftb/any/modal"
  end

 
ビューはこんな感じ

<%= modal_link_to truncate(iftb.repdetail, :length=>38), 
{:action=>:modal_open},{:id=>iftb.id} %>
<%= modal_script :id=> iftb.id %>

「うにょーん」と表示されるようになったけど、ビューの高さが固定なので見た目がよろしくない。

  def modal_script(options={})
      :height  => 450,
       height: #{opts[:height]},

高さのところを削除する。
 
 
いやいや、簡単に仕上がった。