index、listのコードを追う。(さらに詳細にコードを読んでみた)

もう少し詳しくコードを追っておかないと、半年後の自分ではわからなくなると思ったので、自分なりにさらに詳細に。特にlist.rhtmlのところを重点的に読んでみた。大分、わかった気になった。

webブラウザhttp://0.0.0.0:3000/softwares/indexの呼び出し)
http://0.0.0.0:3000/softwares

http://0.0.0.0:3000/softwares/indexと解釈され、コントローラのindexメソッドが呼び出される。

コントローラsoftwares_controller.rb(必要な処理をして値をセットし、ビューlist.rhtmlにページの描画を任せる)
def index
  list
  render :action => 'list'
end

def list
  @software_pages, @softwares = paginate :softwares, :per_page => 10
end

listメソッドを実行した後、list.rhtmlを使って描画する。
つまり、メソッドとしては以下の定義を実行するのと同じ。

def index
  @software_pages, @softwares = paginate :softwares, :per_page => 10*1
  render :action => 'list' ...list.rhtmlを使って描画する。*2
end
ビューlist.rhtml(コントローラからの情報を利用して、ページを描画する)
<h1>Listing softwares</h1> ...h1見出しの表示*3

<table> ...テーブルの始まり、データベースの内容を10件ごとに表示する。*4
  <tr> ...行の始まり、以下3行で列タイトル1行を表示する。
  <% for column in Software.content_columns %> ...softwareテーブルの列タイトル情報を変数columnに入れる、列数分繰り返す。*5
    <th><%= column.human_name %></th> ...1列タイトルの定義、列の名前の1文字目を大文字にして表示する。*6
  <% end %> ...ここまでがfor columnに対する繰り返しの範囲。
  </tr> ...行の終わり。
<% for software in @softwares %> ...softwareテーブルの1行分を変数softwareに入れる。1ページの行数分繰り返す。
  <tr> ...行の始まり、以下6行でテーブルデータ1行を表示する。
  <% for column in Software.content_columns %> ...softwareテーブルの列タイトル情報を変数columnに入れる。列数分繰り返す。
    <td><%= software.send(column.name) %></td> ...列タイトルをキーにして、softwareテーブルのデータを表示する。*7
  <% end %> ...ここまでがfor columnに対する繰り返しの範囲。
     ...以下3行で、行の右側にshow、edit、destroyメソッドへのリンクを表示する。
    <td><%= link_to 'Show', :action => 'show', :id => software %></td>*8
    <td><%= link_to 'Edit', :action => 'edit', :id => software %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :id => software }, :confirm => 'Are you sure?', :post => true %></td>
  </tr> ...行の終わり。
<% end %> ...ここまでがfor softwareに対する繰り返しの範囲。
</table> ...テーブルの終わり。

 ...表示データが10件以上ある場合、Previous page Next pageを表示して前ページ、次ページへの切り替えを可能にする。*9
<% link_to 'Previous page', { :page => @software_pages.current.previous } if @software_pages.current.previous %>
<% link_to 'Next page', { :page => @software_pages.current.next } if @software_pages.current.next %>

<br /> ...改行する。

<%= link_to 'New software', :action => 'new' %> ...New softwareと表示して、newメソッドへのリンクを張る。

*1:paginate :softwares, :per_page => 10
データベースsoftwaresテーブルの内容を、1ページ当り10件に制限した表示データを返す。
@software_pagesにページ情報が入る。
@softwaresに10件分のテーブル情報が入る。(title、description、urlの各値)

*2:renderはページ描画の方法を指定するメソッド。
以下はバリエーションの一部:
render :action => 'list'    list.rhtmlを利用してページ全体を描画する。
render :partial => 'form'    _form.rhtmlを利用してページの一部を描画する。
render :text => 'hello'    「hello」と文字列をそのまま表示する。

*3:見出しの定義にはh1からh6まである。h1が最上位の階層。見え方はスタイルシートの定義による。このブログではこのように表示される。


h1

h2

h3

h4

h5
h6

*4:テーブル<table>は行<tr>の集合で、行<tr>はデータ<td>の集合、データの中にはタイトル<th>となるデータがある。
このように書くと...
<table>
<tr> <th>タイトルA</th> <th>タイトルB</th> <th>タイトルC</th> </tr>
<tr> <td>データ1</td> <td>データ2</td> <td>データ3</td> </tr>
<tr> <td>データ4</td> <td>データ5</td> <td>データ6</td> </tr>
</table>

このように表示される。

タイトルAタイトルBタイトルC
データ1データ2データ2
データ4データ5データ6

*5:for column in Software.content_columns
Software.content_columnsで、Softwareモデルにcontent_columnsメッセージを送信して、データベースのsoftwareテーブルの列情報を取得している。
3列分の情報が取得できるので、for column inの構文によって変数columnに1列ずつ情報を入れて、次のendまでの間を、3回繰り返すことになる。

*6:column.human_name
columnには列情報が入っている。その列情報columnに対してhuman_nameメッセージを送信している。
列情報columnはメッセージを受信するとhuman_nameメソッドを実行し、タイトルの先頭文字を大文字にして文字列を返す。

*7:software.send(column.name)
変数softwareには1行分の情報が入っている。
column.nameで列タイトルを取得して、それをメッセージとして変数softwareに送信している。
変数softwareはタイトルと一致したデータを返信する。

*8:link_to 'Show', :action => 'show', :id => software
「Show」と表示して、そこにhttp://localhost:3000/softwares/show/1のようなリンクを張る。(変数softwareの示すデータベースのテーブルidが1の場合)

*9:@software_pagesには、コントローラでページ情報が入れられている。@software_pages.current.nextとすることで、次ページ情報が求められる。if @software_pages.current.nextがコードの最後に付くことで、「Next pageと表示して、次ページへのリンクを張りなさい、もし次ページが存在するならね」と条件つきで命令していることになるのだ。