日期:2014-05-16  浏览次数:20383 次

RJS模板渲染

?

环境: ruby1.8.7, rails 2.2.2

?

Rails中有3种模板渲染方式, ERB, RJS,Builder

?

下面是使用ERB进行模板渲染的程序,当浏览器发送add_to_cart请求时, 页面使用redirect_to进行重定向,此时render接收@cart 变量,开始渲染模板名称为_cart.html.erb的模板(rails规范,这里的_cart 为:partial => "cart"的转换),从而实现ERB模板渲染。

?

?

 <dir id="cart">
          <%= render(:partial => "cart", :object => @cart) %>
  </dir>

?

?

这种模板渲染在执行完action后,要进行重定向操纵,真个页面都要刷新, 所以Rails提供了RJS模板渲染技术,使用AJAX来向服务器发送Ajax请求

?

?

<% form_remote_tag :url => {:action => 'add_to_cart', :id => product} do -%>
      <%= submit_tag "Add To Cart" %>
<% end -%>

?

?

此时当发送add_to_cart请求时,就会发起Ajax远程调用,还需要在action中增加如下代码,这样rails就会去调用add_to_cart.js.rjs, 注意rjs模板的名称一定要与上面的:action 同名

?

?

  def add_to_cart
    product = Product.find(params[:id])
    @cart = find_cart
    @cart.add_product(product)
    #redirect_to_index
    respond_to do |format|
      format.js
    end
  rescue ActiveRecord::RecordNotFound
     logger.error("attemp to access invalid product #{params[:id]}")
     redirect_to_index("Invalid product")
  end

?

?

?在rjs中指定当前页面中id为cart的元素,将从服务器返回的数据填充进去,即实现了不用刷新界面就讲购物车信息更新的目的

?

?

#add_to_cart.js.rjs

page.replace_html "cart", {:partial => "cart", :object => @cart}

?

?

?

?