index、listのコードを追う。(さらに詳細にコードを読んでみた)
もう少し詳しくコードを追っておかないと、半年後の自分ではわからなくなると思ったので、自分なりにさらに詳細に。特にlist.rhtmlのところを重点的に読んでみた。大分、わかった気になった。
webブラウザ(http://0.0.0.0:3000/softwares/indexの呼び出し)
http://0.0.0.0:3000/softwareshttp://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 endlistメソッドを実行した後、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と表示して、次ページへのリンクを張りなさい、もし次ページが存在するならね」と条件つきで命令していることになるのだ。