131216_03:アジャイル開発本

第11章

タスクF:Ajaxの追加

この章でやること

  • 部分テンプレートの使用
  • ページレイアウト内のレンダリング
  • AjaxおよびJavaScriptを使ったページの動的な更新
  • jQuery UIを使った変更内容の強調表示
  • DOM要素の非表示および表示
  • Ajaxの更新のテスト

 

部分テンプレート

Railsの部分テンプレート(partialと略されることも)は、ビューで使うメソッドのようなものだと考えられる。部分テンプレートとは、ビューの一部を専用のファイルに収めたもの。別のテンプレートやコントローラから部分テンプレートを呼び出す(レンダリングする)ことができ、部分テンプレートは自身をレンダリングして結果を返す。メソッドのように部分テンプレートにパラメータを渡すこともできる。

 

app/views/carts/show.html.erbでカート表示を書き換え。

<table>

  <%= render(@cart.line_items) %>

  

  <tr class="total_line">

    <td colspan="2">合計</td>

    <td class="total_cell"><%= number_to_currency(@cart.total_price) %></td>

  </tr>

 

</table>

 

部分テンプレートをapp/views/line_itemsに_line_item.html.erbという名前で配置

<tr>

  <td><%= line_item.quantity %>&times;</td>

  <td><%= line_item.product.title %></td>

  <td class="item_price"><%= number_to_currency(line_item.total_price) %></td>

</tr>

 

品目に部分テンプレートを使ったので、カートでも同じことをする。

app/views/carts/_cart.html.erbを追加

<div class="cart_title">カート</div>

<table>

  <%= render(cart.line_items) %>

 

  <tr class="total_line">

    <td colspan="2">合計</td>

    <td class="total_cell"><%= number_to_currency(cart.total_price) %></td>

  </tr>

 

</table>

 

<%= button_to 'カートを空にする', cart, method: :delete,

    confirm: '本当によいですか?' %>

 

元のテンプレートを、部分テンプレートをレンダリングするコードに置き換え。

app/views/carts/show.html.erbを編集

<% if notice %>

<p id="notice"><%= notice %></p>

<% end %>

 

<%= render @cart %>

 

次にアプリケーションのレイアウトを変更してサイドバーに新しい部分テンプレートを組み込む。

     <div id=r"cart">

    <%= render @cart %>

    </div>

 

次に、storeコントローラにちょっとした変更を加える。

app/controllers/store_controller.rbを編集

@cart = current_cartを追加(line4)

 

最後にスタイルの指示をサイドバーに出るテーブルにも適用されるように変更。

app/assets/stylesheets/carts.css.scss

.carts, #side #cart {

に編集(line5)

 

緑の背景に黒い文字はあまり読みやすくないので、このテーブルがサイドバーに出るときのルールを追加。

app/assets/stylesheets/layout.css.scss

  #side {

    float: left;

    padding: 1em 2em;

    width: 13em;

    background: #141;

 

    form, div {

      display: inline;

    }  

 

    input {

      font-size: small;

    }

 

    #cart {

      font-size: smaller;

      color:     white;

 

      table {

        border-top:    1px dotted #595;

        border-bottom: 1px dotted #595;

        margin-bottom: 10px;

      }

    }

 

ページ遷移の変更

サイドバーにカートを表示できたので、カートに入れるボタンの動作を変更する。

変更はとてもシンプルで、createアクションの最後でブラウザをインデックスページにリダイレクトさせる。

app/controllers/line_items_controller.rbを編集(line59)

        format.html { redirect_to store_url }