南極の図書館

ペンギンが寝ていた…。

「RailsによるアジャイルWebアプリケーション開発」 その4 タスクD:Ajaxの追加

Ajaxの項を途中まで。(P107〜P117)

Ajaxの準備

部分テンプレート

画面遷移を減らすために、部分テンプレート(partial)を使う。
add_to_cart.html.erbを廃止するために修正をいろいろと加える。

コントローラの修正

書いていて「良くなってきたな」と思ったのがcontrollerで、P112の時点でこんな感じに。
コメントは本に無いけど自分で書いてる。いい本だなぁと思う。

(store_controller.rbの一部)

  def add_to_cart
    product = Product.find(params[:id])
    @cart = find_cart
    @cart.add_product(product)
    redirect_to_index
#C3:フラッシュでエラーを補足
  rescue ActiveRecord::RecordNotFound
    logger.error("無効な商品#{params[:id]}です")
#    flash[:notice] = "無効な商品です"
#    redirect_to :action => 'index'
    redirect_to_index("無効な商品です")
  end

#エラー用のredirectだったが、エラー無しのときもで使えるようにする。
#  def redirect_to_index(msg)
  def redirect_to_index(msg=nil)
#    flash[:notice] = msg
    flash[:notice] = msg if msg
    redirect_to :action => 'index'
  end

アクションの最後にredirect_to : action => '〜〜〜'とすると、
アクション名のviewを見に行かず、リダイレクトできる。これで1画面に機能がまとまったことになる。
ただしカタログが大きいと再表示に時間がかかる&帯域幅やサーバリソースも消費する。
→そこでAjax。


ちなみに、上記のソースは次のページですぐ修正される。
「実にアジャイルですね」とP113にある通りの展開。

Ajax実装

helperのbutton_toを変更。→form_remote_tag
form_****_tagで、HTMLフォームを作成する。remoteというのはAjaxでアプリに対するリモートプロシージャを作成することを示している。

<%= button_to "カートに入れる", :action => 'add_to_cart', :id => product %>

 ↓

<% form_remote_tag :url => { :action => 'add_tp_cart', id = > product } do %>
  <%= submit_tag "かーとにいれる" %>
<% end %>


次にlayouts/store.html.erbに追加。
→<%= javascript_include_tag :defaults %>

実はこれを書き忘れ、下記のソースを見せられて15分くらいはまった。
まさか書き忘れてるとは…。

try {
Element.update("cart", "<div clas(略)


明日はP118から。