Time of Update: 2017-02-27
上次我們實現了登入的頁面,現在我們區別管理員和普通使用者,根據使用者的不同身份,轉入到不同的頁面在rails中提供了filter來截獲訪問某個action的請求,可以用filter在action被調用前或調用後添加我們自己的處理。在這裡,我們在admin的controller中的action被調用前添加攔截器。如果是管理員,就進入管理頁面,如果是普通使用者,就進入登入頁面。1.在application.rb中給ApplicationController類添加authorize方法,代碼如下:de
Time of Update: 2017-02-27
現在我們的購物車程式為兩種使用者提供了服務,一類是普通使用者,一類是管理員。兩類使用者分別有不同的功能。上次我們又實現了添加使用者的功能,這次我們來實現登入的功能。1.給login_controller添加login方法。上次使用rails的命令列產生的login_controller中已經包含了login方法,下面修改該方法的內容:def login if request.get? session[:user_id] = nil @user =
Time of Update: 2017-02-27
在上次的內容裡,我們完成了訂單的編寫。這次我們類比一個簡單的送貨頁面,給這個購物車的管理員用。1.首先,我們修改order表,給他添加一個欄位shipped_at:create table orders (id int not null auto_increment,name varchar(100) not null,email varchar(255) not null,address text not null,pay_type char(10) not null,shipped_at
Time of Update: 2017-02-27
在上次的內容裡,我們編寫了CHECKOUT的處理。這次我們將顯示購物車和訂單放在一個頁面上表示,這樣使用者在下訂單的時候就可以很方便地看到自己的購物情況。1.修改checkout.rhtml檔案,只要添加一句代碼:<%= error_messages_for("order") %><%= render_component(:action => "display_cart") %> ――這句 <%= stylesheet_
Time of Update: 2017-02-27
在上次的內容裡,我們建立了訂單的Model,和表示頁面,這次繼續編寫CHECKOUT的處理。1.在checkout.rhtml的頁面上,有一個CHECKOUT按鈕,上次還沒有給它編寫處理代碼,現在在store_controller中添加save_order方法,代碼如下:def save_order@cart = find_cart@order = Order.new(params[:order])@order.line_items <<@cart.itemsif
Time of Update: 2017-02-27
在上次的內容裡,我們實現了清空購物車和金額的格式化處理。這次實現訂單的模組。1.首先,我們要在資料庫裡建立Order表,建立表的Sql如下:create table orders (id int not null auto_increment,name varchar(100) not null,email varchar(255) not null,address text not null,pay_type char(10) not null,primary key
Time of Update: 2017-02-27
在上一篇隨筆中,我們為Products建立了一個維護用的列表頁面,效果如圖:這次我們使用上面維護的Products列表來建立一個終端使用者使用的購物頁面。1.建立控制器(Controller),命名為store,我們通過命令列來建立它:depot> ruby script/generate controller Store index開啟...rails_apps\depot\app\controllers目錄下的store_controller.rb檔案,向其中添加代碼:def
Time of Update: 2017-02-27
在上一篇隨筆中,我們給Products的建立頁面添加了輸入驗證,今次的內容非常簡單,來稍稍美化下Products的列表頁面。1.開啟app\views\admin\list.rhtml檔案,可以看到下面的代碼<h1>Listing products</h1> <table> <tr> <% for column in Product.content_columns %> <th><%=
Time of Update: 2017-02-27
在上一篇隨筆中,我們完成了對一個表Product的添刪查改的操作,你一定注意到了,我們還沒有添加任何驗證,例如Price,我們可以隨意輸入任何字元,而不會有錯誤提示。這次,我們就來看看怎樣添加驗證輸入功能。1.開啟depot\app\models目錄下的product.rb檔案,向其中添加代碼,如下:class Product < ActiveRecord::Base validates_presence_of :title, :description, :image_urlend2.
Time of Update: 2017-02-27
一、ruby和rails簡介ruby是一種物件導向的動態指令碼語言。它的文法很靈活,而且提供了豐富的類庫。因此,用ruby編寫程式的效率是非常高的。雖然ruby很早就出現了(1993年誕生於日本),但由於ruby一直缺乏英語文檔,而且當時的ruby在web開發上並不怎麼出眾。因此,在2000年之前,ruby還只在日本流行。但這一切被2000年問世的rails打破。Rails是使用純ruby編寫的架構(framework)。它對web開發提供了強有力的支援,如支援資料對應、MVC模式、Web
Time of Update: 2017-02-27
你是一位資深的.NET程式員,而且已經用ASP.NET構建過許多Web應用。無數個不眠之夜,為了讓ASP.NET控制項生命週期中的事件驅動模型按你想要的方式執行,你費盡心血,深入細節。你精通於使用諸如Presentation Model、Model View Presenter這類設計模式對你的應用進行分層,以使其更易測試和維護。你認為Ruby on
Time of Update: 2017-02-27
或許存在這樣的情況,在一個表中,一條記錄關聯到表中的另一條記錄,例如,公司中的每個僱員都有上級和下級,而他們同時又是僱員,在Rails中你可以這樣使用Employee類:class Employee < ActiveRecord::Basebelongs_to :manager,:class_name => "Employee",:foreign_key => "manager_id"belongs_to
Time of Update: 2017-02-27
在Rails中多對多關聯通過在關聯表對應的類中聲明has_and_belongs_to_many來實現。在資料庫中,多對多關聯使用中間表來實現,表中包括關聯表的主鍵,Active
Time of Update: 2017-02-27
一對一關聯,或者更正確的說是一對零或一對一關聯,是通過外鍵引用到另外一張表中的至多一條記錄實現的,下圖描述了orders表和invoices表的關係:在Active Record中,要表示這樣的關係需要在Order類中添加has_one:Invoice聲明,並且同時在Invoice類中添加聲明belongs_to:order,事實上,我們可以把這種關聯關係看作是相互的,我們可以使Invoice有一個Order,也可以使Order有一個Invoice,不同的是,在將Object Storage
Time of Update: 2017-02-27
Rails支援三種表間關聯關係,一對一,一對多,多對多,你需要在Model中加入聲明來標識這些關聯:has_one,has_many,belongs_to,has_and_belongs_to_many。一對一關聯關係可能存在於象訂單和發票這樣的關係,一個訂單只能有一個發票,在Rails中,我們這樣指明:class Order < ActiveRecord::Basehas_one :invoice. . .class Invoice <
Time of Update: 2017-02-27
很多程式使用的資料庫都包含有多個表,而且通常一些表之間還有關聯關係,訂單常含有多個條目,而一個條目又關聯到一種商品,一個商品可能又屬於多個商品分類,一個商品分類裡又包含有多個不同的商品。在資料庫中,這些關聯表現為使用主索引值把表關聯起來,也就是外鍵,但是這屬於底層的範疇,我們需要處理Model對象間的關聯,而不是資料庫中的列和鍵。如果一個訂單含有多個條目,我們需要有辦法來維持,處理它們的關係,如果一個條目引用到一種商品,我們或許想這樣做:price =
Time of Update: 2017-02-27
在學習Rails中的並發處理的處理前,我們先簡單瞭解下並發處理的概念。在有多個處理同時訪問同一個資料庫的應用程式中,可能會出現這樣的情況,因為一個處理更新了資料庫中的行,而使得另一個處理中持有的資料變得陳舊了。例如,A和B先後從資料庫中提取了相同的資料,並都做了修改,這時B先將自己的修改更新會資料庫,稍後,A將自己的修改更新回資料庫,這時將會覆蓋B所作的修改,當B再次提取資料庫後,看到的是A修改的結果,而不是自己的。一個解決辦法就是將更新的表或者行進行鎖定,防止其他程式進行更新或者訪問,鎖定可以
Time of Update: 2017-02-27
前面瞭解了檢索的方法,這次來看看Active Record怎樣更新資料庫中的記錄。如果你有一個Active Record對象(或許對應於order表),你可以通過調用save方法將它寫道資料庫中去,如果這個對象是先前從資料庫中讀取出來的,save方法將會更新既有的記錄,否則將會建立一條記錄。如果一條既有記錄被更新,Active Record將會用它的主鍵和來匹配記憶體中的對象,Active Record對象中的屬性被更新到對應的列,即使一個列中的值沒有變化也會被更新,在下面的例子中,id為123
Time of Update: 2017-02-27
資料庫上最常啟動並執行查詢莫過於根據指定條件返回符合的結果集,查詢可能是返回所有名字為‘dave’的訂單,或者是某個部落格上所有標題含Rails的post,在很多其他的架構和程式設計語言中,你需要建立sql來執行查詢,Active Record利用了ruby語言所包含的動態能力來做這些事。例如,我們的Order Model包含了諸如name,email,address這樣的屬性,我們可以使用這些名字對應的find方法來查詢,例如:order =
Time of Update: 2017-02-27
現在我們知道如何指定條件,現在我們來看看find方法支援的一些其他設定。首先,理解find(:first,…)方法是非常重要的,該方法在同樣的conditions設定下,和find(:all,…)方法產生同樣的sql語句,不同之處僅在於只返回一條記錄。在調用的時候,一種的參數為:first,另一種為:all。find方法執行一個select