「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から。