railsチュートリアルの説明の大まかな流れ
まずユーザーに送信すべきレスポンスの内容を決定し、次にユーザーへのレスポンスを作成する適切なメソッドを呼び出します。
レスポンス画面を完全なビューで作成すると、Railsはそのビューをレイアウトでラップ
して、場合によってはパーシャルビュー
もそこに追加します。本ガイドではこれらの方法をひととおり紹介します。
気づき
レイアウトでラップするという意味がわからない。
包むというらしい。
コントローラ名のビューを探してレンダリングする。
「コントローラのアクションの末尾で明示的にレンダリングが指示されていない場合は、コントローラが利用可能なビューのパスからアクション名.html.erbというビューテンプレートを探し、それを使って自動的にレンダリング
する」
renderメソッド
ほとんどの場合、アプリケーションがブラウザで表示するコンテンツのレンダリングには
ActionController::Base#renderメソッド
が使われます。
できること
特定のテンプレート、ファイル、インラインコードを指定
してレンダリングすることも、何も出力しないようにする
こともできます。テキスト、JSON、XMLをレンダリング
することもできます。
他にも
レスポンスをレンダリングするときにContent-TypeヘッダーやHTTPステータスを指定
することもできます。
別コントローラの配下のテンプレートをレンダリングする。
あるコントローラのアクションから、まったく別のコントローラの配下にあるテンプレートを利用してレンダリング
することは可能です。これもrenderメソッドでできます。
...
renderメソッドにはapp/viewsを起点とするフルパスを渡せる
ので、レンダリングするテンプレートをフルパスで指定
します。
renderで:inlineを指定する
renderメソッドを呼び出すときに:inlineオプションでERBを渡すと、ビューをまったく使わずにレンダリングできます。以下の書き方は完全に有効です。
render inline: "<% products.each do |p| %><p><%= p.name %></p><% end %>"
注意点
このオプションを実際に使う意味はめったにありません。
コントローラのコードにERBを直接書き込むと、RailsのMVC指向が損なわれ
、開発者がプロジェクトのロジックを追いかけることが難しくなってしまいます。ERBビューをお使いください。
テキストをレンダリングする
renderメソッドで:plainオプションを指定すると、平文テキストをマークアップせずにブラウザに送信できます。
render plain: "OK"
render_to_stringメソッド
render呼び出しの正確な結果をブラウザを使わずに調べたい場合は、render_to_stringを利用できます。このメソッドの振る舞いは、レンダリング結果をブラウザに返さずに文字列を返す点を除けば、renderと完全に同じ
です。
気づき
いつか使えそうかな。
redirect_toメソッドを使う。
renderはレスポンスを構成するときに使うビュー(または他のアセット)を指定しますが、redirect_toメソッドは、この点においてrenderメソッドと根本的に異なります
。
redirect_toメソッドは、別のURLにリクエストを再送信するようブラウザに指示
します。
たとえば以下の呼び出しを行なうと、アプリケーションで現在どのページが表示されていても、写真のindexページにリダイレクト
されます。
redirect_to photos_url
redirect_toを実行すると、コードはそこで実行を停止して、ブラウザからの次のリクエストを待ちます
(これは通常のスタンバイ状態
です)。その直後、redirect_toでブラウザに送信したHTTPステータスコード302に従って、ブラウザは別のURLへのリクエストをサーバーに送信し、サーバーはそのリクエストを改めて処理します。
def index
@books = Book.all
end
def show
@book = Book.find_by(id: params[:id])
if @book.nil?
render action: "index"
end
end
上のフォームのコードでは、````@bookインスタンス変数がnilの場合に問題が生じる可能性があります。render :actionを実行しても、対象となるアクションのコードは実行されないことを思い出しましょう。つまりindexビューでおそらく必要となる
@booksインスタンス変数には何も設定されず、空の蔵書リストが表示```されてしまいます。 これを修正する方法の1つは、```renderを以下のようにredirect_toに変更```することです。
def index
@books = Book.all
end
def show
@book = Book.find_by(id: params[:id])
if @book.nil?
redirect_to action: :index
end
end
上のコードでは、ブラウザから改めてindexページにリクエストが送信されるので、indexメソッドのコードが正常に実行されます。
上のコードで惜しい点は、ブラウザとの通信が1往復必要になることです。ブラウザから/books/1に対してshowアクションが呼び出され、本が1冊もないことをコントローラが検出
すると、コントローラはブラウザにステータスコード302(リダイレクト)レスポンスを返し、/books/に再度アクセスするようブラウザに指示
します。ブラウザはこの指示に沿って、コントローラのindexアクションを呼び出すリクエストを改めてサーバーに送信
します。コントローラはこのリクエストを受け取って、データベースからすべての蔵書リストを取り出し、indexテンプレートをレンダリングして結果をブラウザに送り返すと、ブラウザで蔵書リストが表示されます。
気づき
renderとredirect_toの違いがわからなかった。
もっと勉強をしなければならない。
時間が来たのでまた。
とりあえずrenderメソッドを使い。
もう一度疑問点を洗い出す。
出典