<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    子在川上曰

      逝者如斯夫不舍晝夜
    隨筆 - 71, 文章 - 0, 評論 - 915, 引用 - 0
    數據加載中……

    Rails學習筆記(5)第6、7、8章摘要

    創建一個項目:rails depot

    執行SQL腳本:mysql depot_development < db/create.sql
    創建三個庫,分別用于開發、測試、生產:depot_development、depot_test、depot_production。
    每個表都應該帶一個和業務無關的ID字段。
    在rails配置數據庫的連接:config\database.yml。密碼之前冒號之后要間隔一個空格。

    ruby script/generate scaffold Product Admin,針對Product表產生一整套的網頁程序(增刪改),Admin是控制器名
    ruby script/generate controller Store index   創建一個名為Store的控制器,并含有一個index() Action方法。


    啟動WEB服務:ruby script/server。(http://localhost:3000/admin


    模型類:
    。validates_presence_of  :title, :desc, :image_url   必須不為空
    。validates_numericality_of :price  必須是數字
    。validates_uniqueness_of   :title   必須唯一
    。validates_format_of       :image_url,
                                :with    => %r{^http:.+\.(gif|jpg|png)$}i,
                                :message => "must be a URL for a GIF, JPG, or PNG image"  文件名必須是圖片文件的擴展名
    。模型保存到數據庫之前會調用validate方法,例:
      def validate
        errors.add(:price, 
    "should be positive") unless price.nil? || price > 0.0
      end



    ActiveRecord的方法屬性:
    。content_columns 得到所有字段。content_columns.name字段名
    。日期在今天之前,按日期倒序排列。self表示它是一個類方法(靜態方法)。
      def self.salable_items
        find(:all, :conditions 
    => "date_available <= now()", :order => "date_available desc")
      end


    以下為鏈接,效果相當于以前的“http://..../show.jsp?id=11
          <%= link_to 'Show', :action => 'show', :id => product %><br/>
          
    <%= link_to 'Edit', :action => 'edit', :id => product %><br/>
          
    <%= link_to 'Destroy', { :action => 'destroy', :id => product }, :confirm => "Are you sure?" %>


    <%=  if @product_pages.current.previous 
           link_to(
    "Previous page", { :page => @product_pages.current.previous })
         end
    %>

    <%= if @product_pages.current.next 
          link_to(
    "Next page", { :page => @product_pages.current.next })
        end
    %>


    truncate(product.desciption, 80)  顯示產品描述字段的摘要(80個字符)
    product.date_available.strftime("%y-%m-%d") 日期字段的格式化顯示
    sprintf("%0.2f", product.price) 數值的格式化顯示, number_to_currency方法也有類似功能

    public/stylesheets 目錄保存了網頁所用的CSS式樣表。用ruby script/generate scaffold ....生成框架代碼的網頁自動使用scaffold.css


    布局模板
    。app/views/layouts目錄中創建一個與控制器同名的模板文件store.rhtml,則控制器下所有網頁都會使用此模板

     

    <html>
        
    <head>
          
    <title>Pragprog Books Online Store</title>
          
    <%= stylesheet_link_tag "scaffold""depot", :media => "all" %>
        
    </head>
        
    <body>
            
    <div id="banner">
                
    <img src="/images/logo.png"/>
                
    <%= @page_title || "Pragmatic Bookshelf" %>
            
    </div>
            
    <div id="columns">
                
    <div id="side">
                    
    <a href="http://www.">Home</a><br />
                    
    <a href="http://www./faq">Questions</a><br />
                    
    <a href="http://www./news">News</a><br />
                    
    <a href="http://www./contact">Contact</a><br />
                
    </div>
                
    <div id="main">
                    
    <% if @flash[:notice] -%>
                      
    <div id="notice"><%= @flash[:notice] %></div>
                    
    <% end -%>
                    
    <%= @content_for_layout %>
                
    </div>
            
    </div>
        
    </body>
    </html>

    。<%= stylesheet_link_tag "scaffold""depot", :media => "all" %>生成指向scaffold.css、depot.css兩個式樣表的<link>標簽
    @page_title 各個頁面標題變量
    @flash[:notice] 提示性的信息(key=notice),這是一個公共變量。
    。<%= @content_for_layout %> 位置嵌入顯示控制器內名網頁。由于其他網頁變成了模板的一部份,所以其<html>等標簽應該去掉。



    store_controller.rb ,當從session里取出某購物車不存在,則新建一個,并存入session。最后把此購物車賦給變量cart。

      def find_cart
        @cart 
    = (session[:cart] ||= Cart.new)
      end


    ruby  script/generate  model  LineItem,創建一個LineItem的數據模型,附帶還會創建相應的測試程序。

    store_controller.rb:

      def add_to_cart
        product 
    = Product.find(params[:id])
        @cart.add_product(product)
        redirect_to(:action 
    => 'display_cart')
      rescue
        logger.error(
    "Attempt to access invalid product #{params[:id]}")
        redirect_to_index(
    'Invalid product')
      end

    。params是URL的參數數組
    。redirect_to轉向語句
    。rescue 異常,相當于Java的Exception
    。redirect_to_index是application.rb中的一個方法,這個文件里的方法是各控制器公開的。
    。logger是rails內置的變量。

    class Cart

      attr_reader :items
      attr_reader :total_price
      
      def initialize
        empty
    !
      end

      def add_product(product)
        item 
    = @items.find {|i| i.product_id == product.id}
        
    if item
          item.quantity 
    += 1
        
    else
          item 
    = LineItem.for_product(product)
          class Cart

      # An array of LineItem objects
      attr_reader :items

      # The total price of everything added to this cart
      attr_reader :total_price
     
      # Create a new shopping cart. Delegates this work to #empty!
      def initialize
        empty!
      end

      # Add a product to our list of items. If an item already
      # exists for that product, increase the quantity
      # for that item rather than adding a new item.
      def add_product(product)
        item = @items.find {|i| i.product_id == product.id}
        if item
          item.quantity += 1
        else
          item = LineItem.for_product(product)
          @items << item
        end
        @total_price += product.price
      end

      # Empty the cart by resetting the list of items
      # and zeroing the current total price.
      def empty!
        @items = []
        @total_price = 0.0
      end
    end

        end
        @total_price 
    += product.price
      end

      def empty
    !
        @items 
    = []
        @total_price 
    = 0.0
      end
    end 


    。由于Cart沒有對應的數據表,它只是一個普通的數據類,因此要定義相應的屬性。
    。@items << item 把對象item加入到@items數組
    。@items=[]   空數組


    如果出現SessionRestoreError錯誤,則檢查application.rb是否做了如下的模型聲明。因為對于動態語句,session把序列化的類取出時,否則是無法知道對象類型的,除非聲明一下。

    class ApplicationController < ActionController::Base
      model :cart
      model :line_item
    end


    <%  ... -%>  -%>相當于一個換行符


    @items.find(|i| i.product_id == product.id)  |i|的作用應該相當于@items數組中的一個元素(書上沒有提到,要查一下ruby語法)。


    if @items.empty?   判斷數組是否為空數組

    flash[:notice] flash可以在同一個Session的下一個請求中使用,隨后這些內容就會被自動刪除(下一個的下一個就被清空了??)。
    實例變量是代替不了flash的,因為IE無狀態的特性,在下一個請求中,上一個請求的實例變量已失效。


    當異常沒有被任何程序捕捉,最后總會轉到ApplicationController的rescue_action_in_public()方法


    各視圖可以使用appp/helpers目錄下的各自相應的輔助程序中提供的方法。

     

    posted on 2007-04-10 09:47 陳剛 閱讀(1683) 評論(1)  編輯  收藏 所屬分類: Rails&Ruby

    評論

    # re: Rails學習筆記(5)第6、7、8章摘要  回復  更多評論   

    ruby script/generate scaffold Product Admin
    貌似 在rails 2.0中,不支持這種方法了吧 貌似不能指定建立控制器.

    現在的建 scaffold的方法
    ruby script/generate scaffold Product title:string .....

    不知道我理解的對否,望指正
    2008-01-18 15:08 | 就這調調
    主站蜘蛛池模板: 亚洲AV永久青草无码精品| 操美女视频免费网站| 亚洲午夜爱爱香蕉片| 亚洲成A人片在线观看无码3D| 亚洲 日韩 色 图网站| 免费看的一级毛片| 美女露隐私全部免费直播| 亚洲区日韩区无码区| 中文字幕免费播放| 好看的亚洲黄色经典| 日本免费一区二区三区四区五六区| 久久精品国产亚洲av影院| eeuss在线兵区免费观看| 久久亚洲高清综合| 久久爰www免费人成| 亚洲春黄在线观看| 91麻豆国产免费观看| 亚洲一区在线视频观看| 国产精品国产自线拍免费软件| 国产亚洲美女精品久久久久| 亚洲伊人久久成综合人影院| 在线人成免费视频69国产| 亚洲婷婷综合色高清在线| 国产成人免费A在线视频| 精品国产福利尤物免费| 亚洲午夜在线电影| 午夜时刻免费入口| avtt天堂网手机版亚洲| 欧洲美熟女乱又伦免费视频| 国产黄色片免费看| 亚洲一区二区三区国产精品无码| 午夜国产羞羞视频免费网站| 男人都懂www深夜免费网站| 91在线亚洲综合在线| 国产成人A亚洲精V品无码| 成人黄色免费网址| 一级做α爱过程免费视频| 亚洲精品无码成人片在线观看 | 国产成人亚洲综合在线| 亚洲av永久无码精品国产精品| 久久不见久久见免费影院|