ruby on rails(9) -- AJAX(1)

   火热的Ajax啊,全世界的程序员都在讨论它(c,c++请飘过),终于我要开始学习啦。
    首先是代码重用,rails为了使逻辑和表现分开,采取了一些列的方法,其中之一是,不要把逻辑写在表现页面上。因为,我们要分离拉。局部的代码,就采用partical。如<%= render(:partial =>"cart_item", :collection => cart.items)%>,:partial 的参数所对应的页面就是在参数名前加_.因此对应的页面为_cart_item.html.erb.
   修改add_to_cart.html.erb
 
<table>
 <%= render(:partial => "cart_item",:collection => @cart.items)%> 
  <tr class="total-line">
    <td colspan="2">Total</td>
    <td class="total-cell"><%= number_to_currency(@cart.total_price) %></td>
  </tr>
</table>
  

  由于:partial 所指的为cart_item.因此,编写页面_cart_item.html.erb,:collection嘛意思么
  
   _cart_item.html.erb
 
  <tr>
     <td><%=h cart_item.quantity %>&times;</td>
     <td><%=h cart_item.title%></td>
     <td class="item-price"><%= number_to_currency(cart_item.price)%>
  </tr>
  

  里面的变量名和:partial参数一致
  同理,修改layout/store_html.erb页面
 
  	<div id="side">
	   <div id="cart">
	<%= render (:partial => "cart",:object => @cart)%>		   </div>
  

   bject又是嘛意思么,这些个参数,刷新@cart?
   然后编写 _cart.html.erb ,用于计算total_price
  
   <div class="cart-title">Your Cart</div>
   <table>
	<%= render(:partial =>"cart_item", :collection => cart.items)%>
	<tr class="total-line">
	<td colspan="2">Total</td>
	<td class="total-cell"><%= number_to_currency(cart.total_price)%></td>	
	</tr>	
</table>
<%=button_to "Empty Cart", :action =>:empty_cart%>
   

    @cart未定义,所以在store_controller里面
    
      def index
  	@products = Product.find_products_for_sale
  	@cart = find_cart
      end
     

    然后修改css亦即重定向。即可看到购物车在左边,原来的废掉了。css使购物车放右边,就是平时网页上的购物车了。
  ps:partial 如果对应的逻辑页面多,能否写到一个上去,或者有什么方法便于管理多个逻辑页面,不能就这么放在view下吧

   接下来是正题,ajax
   首先引入rails的js包,layout/store_controller.html.erb导入  <%= javascript_include_tag :defaults%>
   然后删除index.html.erb <%=button_to ... %>,改为
 
  <%form_remote_tag :url => {:action => :add_to_cart,:id => product}   do%>
  <%= submit_tag "Add to Cart"%>
  <%end%>
  

  form...tag ,表示要用<form>,remote表示远程调用Ajax。url 服务程序调用地址 do,end form基本格式
   然后修改add_to_cart action 如下
  
   else
  	@cart = find_cart
  	@cart.add_product(product)
  	respond_to{|format| format.js}
    end
   

   repond_to 根据不同的格式类型采取不同的处理方式。客户端发送给浏览器式,头部Accept-Type: text/xml,指明格式,浏览器根据这个,采取不同的处理方式,未指明,默认text/html。
   format.js指向index.rjs
   然后编辑view/store/add_to_action.js.rjs。为什么在这个目录?
   page.replace_html("cart",:partial => "cart", bject => @cart)
   page,js产生器,page_html()取代
<div id="cart">
<%= render (:partial => "cart",:object => @cart)%>
</div>
参数必须一致

你可能感兴趣的:(html,Ajax,css,Ruby,Rails)