createのコードを追う。

createボタンをクリックした後のコードの流れ。

webブラウザ


新規作成(new)ページでcreateボタンをクリックすると下記ページが表示される。

http://localhost:3000/softwares/list

コントローラ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.」のメッセージが表示されるのだ。ページ全体の統一した見栄えや操作感をここで実現できる。