レスポンス

要は、結果表示の事ネ!

  • 主要なのは、以下のメソッドみたい
    render テンプレート出力やテキスト出力/スクリプト出力をする、汎用的な結果出力
    redirect_to リダイレクト
    send_file ファイル出力
    send_data バイナリデータ出力
    head ヘッダ出力のみ
    • 以下、いろいろと詳細をメモ

テンプレートファイルの呼び出しは、renderで!

  • 基本は、何も書かなければ、クラス名/メソッド名.html.erbが呼び出される
    • ctrl#res_renderアクションなら、ctrl/res_render.html.erbね!
  • 別のテンプレートを呼びだすのは、:actionで!
    render :action => 'index'
    
    • これで、ctrl/index.html.erbを呼びだすってこと。
    • これは、テンプレートを呼びだして描画するだけで、アクションは呼ばないことに注意!
    • :actionは自分のコントローラを基準として、テンプレートを呼びだすんだね。
  • 別フォルダのテンプレートを呼び出すのは、:templateで!
    @msg = 'hello/viewだよね?'
    render :template => 'hello/view'
    
    • これだと、hello/view.html.erbを呼びだすんだねー。
  • コントローラどころか、別アプリのテンプレートを呼びだすなら、:file!
    render :file => 'data/template/list'
    
    • これだと、「C:/data/template/list」を呼びだす、と。→(Windowsの場合ね)
  • おおっと?上記は全て省略形があるんだ!
    render 'index'
    render 'hello/view'
    render 'data/template/list'
    
    • うーん、:templateと:fileの判別は、どうやってるんだろう?→あ、しないのか!きっと、単に順番に見ていくだけなんだ!
    • やっぱり、省略形がきれいな気がするなー。ふつうはこっちだろうな。
  • ちなみに、2回renderするとエラーが出るってさ。そらそうだろ。
    • じゃー、どうするの、って言うと、以下見たいに、単にrerurnすりゃー、いいだけw
      render 'index' and return
      

直接、設定もrenderで!

  • まあ、基本はデバッグ用だと思うけど、こう書ける
    render :text => 'こんな感じで直接テキストを書けるよ!'
    
  • :inlineだと、ERBとして解釈して出力可能みたい
    @msg = 'ERBを解釈してるはず'
    render :inline => '@msg = [<%= @msg %>]'
    
  • :text/:inlineだと、基本、レイアウトが適用されないので、注意ね!

空のコンテンツ出力は、render/headで!

  • へー、renderでも空で出力&ステータス指定ができたんだ
    render :nothing => true, :status => 404
    
  • で、headだと、同じのがこんな感じで
    head 404
    
    • 一応、こんな感じでも書けるみたいだけど…、微妙…
      head :not_found
      

リダイレクトは、redirect_toで!

  • へー、結構いろいろなリダイレクトできるんだー。
    redirect_to 'http://www.google.com'                   # 直接URLね
    redirect_to :action => 'index'                        # 同じコントローラ内の別アクション
    redirect_to :controller => 'hello', :action => 'view' # 別コントローラのアクション
    redirect_to books_path                                # ビューヘルパー
    redirect_to :back                                     # 1つ前に戻る→なんだけど、動かん?
    
    • んー、:backはリファラーが無いからエラーみたい?リダイレクト自体は動いてるし、まあいっか。
    • あ、あと、リダイレクト時には、パラメータでstatusも指定できるみたい。

ファイルの内容を出力するには、send_fileメソッドで!

  • まあ、こんな感じかな?
    send_file 'C:/data/test.zip'
    send_file 'C:/data/test.gif', :type => 'image/gif', :disposition => 'inline'
    send_file 'C:/data/test.gif', :filename => 'downfile.gif'
    
  • 当たり前だけど、ファイル名をパラメータで直接指定するとセキュリティ上まずいんで、要注意!

バイナリ出力するには、send_dataメソッドで!

  • まあ、こんな感じかな?
    data = File.read('C:/data/test.bmp')
    send_data data, :type => 'image/bmp', :disposition => 'inline', :filename => 'test.bmp'
    
    • うーん、gifにしたら、なんか画像がおかしくなっちゃったんだが…。画像サイズを指定してないから?
-
最終更新:2012年01月03日 09:04