createのコードを追う。
createボタンをクリックした後のコードの流れ。
コントローラsoftwares_controller.rb
def create @software = Software.new(params[:software]) ...入力フォームのidがsoftwareの項目情報を元に、Softwareモデルを新規追加し、変数@softwareに入れる。 if @software.save ...変数@softwareの情報をデータベースsoftwaresテーブルに追加保存する。正常に保存できたら、以下2行を実行する。 flash[:notice] = 'Software was successfully created.' ...flash[:notice]というデータ保存場所にSoftware was successfully created.を書き込む。 redirect_to :action => 'list' ...http://localhost:3000/softwares/listへの接続を実行する。*1 else ...正常に保存できない場合は、以下1行を実行する。 render :action => 'new' ...new.rhtmlを利用して描画する。 end ...if〜else〜end構文の終了。 end
ビュー
正常に保存できた場合は、listメソッドを実行して、list.rhtmlで描画する。これは以前チェックしているのでOK。
正常に保存できなかった場合は、new.rhtmlで再描画する。これも以前チェックしているのでOK。
一つ気になるのが、正常に保存できた場合、ページの一番上に緑色で「Software was successfully created.」のメッセージが表示される。この表示はどこで描画しているのか?
- software.rhtml
- softwaresフォルダのrhtmlの描画で、全てに共通する部分を描画しているのだ。
<html> <head> ...ウィンドウのタイトルや、文書の書式など、文章ではなく関連する情報を記載する部分。 <title>Softwares: <%= controller.action_name %></title> ...ウィンドウのタイトルを表示する。controller.action_nameでコントローラが処理しているメソッド名を表示する。 <%= stylesheet_link_tag 'scaffold' %> ...ページの描画にスタイルシートpublic/stylesheets/scaffold.cssの利用を指定している。 </head> <body> ...文章や写真など、目に見える形で表示される内容を記載する部分。 <p style="color: green"><%= flash[:notice] %></p> ...この段落の表示に緑色を指定している。flash[:notice]の内容を表示する。 <%= yield %> ...この部分はsoftwaresフォルダ中のそれぞれのrhtmlファイルの描画内容に置き換わる。*2 </body> </html>
*1:redirect_to :action => 'list'と、listメソッド呼び出しの違い。
redirect_toではwebブラウザでアドレス入力したのと同じ動作をする。
つまり、URLの表示はhttp://localhost:3000/softwares/listとなり、listメソッドを実行した後、list.rhtmlを利用して自動的に描画を行う。
一方、listメソッドの呼び出しでは、URLの表示は処理中のメソッドの表示のまま変更なし、listメソッドを実行した後のlist.rhtmlの描画も自動的に行わない。
*2:例えば、list.rhtmlが呼び出された時は、この部分はlist.rhtmlのコードで置き換えられ、ページ全体が描画される。list.rhtmlをsoftware.rhtmlというフォトフレームに入れるようなものだ。この仕組みによって、緑色で「Software was successfully created.」のメッセージが表示されるのだ。ページ全体の統一した見栄えや操作感をここで実現できる。