1.session是什么?
Session:在計(jì)算機(jī)中,尤其是在網(wǎng)絡(luò)應(yīng)用中,稱為“會(huì)話控制”。?Session?對(duì)象存儲(chǔ)特定用戶會(huì)話所需的屬性及配置信息。 ... 當(dāng)用戶請求來自應(yīng)用程序的Web 頁時(shí),如果該用戶還沒有會(huì)話,則Web 服務(wù)器將自動(dòng)創(chuàng)建一個(gè)Session?對(duì)象。
百度百科:https://baike.baidu.com/item/Session/479100
由于HTTP協(xié)議是無狀態(tài)的協(xié)議,所以服務(wù)端需要記錄用戶的狀態(tài)時(shí),就需要用某種機(jī)制來識(shí)具體的用戶,這個(gè)機(jī)制就是Session.典型的場景比如購物車,當(dāng)你點(diǎn)擊下單按鈕時(shí),由于HTTP協(xié)議無狀態(tài),所以并不知道是哪個(gè)用戶操作的,所以服務(wù)端要為特定的用戶創(chuàng)建了特定的Session,用用于標(biāo)識(shí)這個(gè)用戶,并且跟蹤用戶,這樣才知道購物車?yán)锩嬗袔妆緯_@個(gè)Session是保存在服務(wù)端的,有一個(gè)唯一標(biāo)識(shí)。在服務(wù)端保存Session的方法很多,內(nèi)存、數(shù)據(jù)庫、文件都有。集群的時(shí)候也要考慮Session的轉(zhuǎn)移,在大型的網(wǎng)站,一般會(huì)有專門的Session服務(wù)器集群,用來保存用戶會(huì)話,這個(gè)時(shí)候 Session 信息都是放在內(nèi)存的,使用一些緩存服務(wù)比如Memcached之類的來放 Session。
2.COOKIE和SESSION有什么區(qū)別?
思考一下服務(wù)端如何識(shí)別特定的客戶?這個(gè)時(shí)候Cookie就登場了。每次HTTP請求的時(shí)候,客戶端都會(huì)發(fā)送相應(yīng)的Cookie信息到服務(wù)端。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來實(shí)現(xiàn)Session跟蹤的,第一次創(chuàng)建Session的時(shí)候,服務(wù)端會(huì)在HTTP協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個(gè)Session ID,以后每次請求把這個(gè)會(huì)話ID發(fā)送到服務(wù)器,我就知道你是誰了。有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下,會(huì)使用一種叫做URL重寫的技術(shù)來進(jìn)行會(huì)話跟蹤,即每次HTTP交互,URL后面都會(huì)被附加上一個(gè)諸如 sid=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識(shí)別用戶。 Cookie其實(shí)還可以用在一些方便用戶的場景下,設(shè)想你某次登陸過一個(gè)網(wǎng)站,下次登錄的時(shí)候不想再次輸入賬號(hào)了,怎么辦?這個(gè)信息可以寫到Cookie里面,訪問網(wǎng)站的時(shí)候,網(wǎng)站頁面的腳本可以讀取這個(gè)信息,就自動(dòng)幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點(diǎn)甜頭。所以,總結(jié)一下:Session是在服務(wù)端保存的一個(gè)數(shù)據(jù)結(jié)構(gòu),用來跟蹤用戶的狀態(tài),這個(gè)數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫、文件中;Cookie是客戶端保存用戶信息的一種機(jī)制,用來記錄用戶的一些信息,也是實(shí)現(xiàn)Session的一種方式。
3.find_by 與 find的不同?(搜索后才發(fā)現(xiàn)還有個(gè)where)
區(qū)別是當(dāng)找到記錄時(shí),或者找不到記錄時(shí)返回的內(nèi)容。考慮以下示例:
>> User.create name: 'THE USER' # creates a user with id = 1
>> User.find(1) # returns the user>> User.find_by_id(1) # returns the user
>> User.where(id: 1).first # returns the user
您可以看到,可以使用3種方法中的任何一種提取現(xiàn)有用戶。使用where的最大區(qū)別是你可以鏈接命令(當(dāng)然,不先調(diào)用)。
讓我們來看看當(dāng)你嘗試找到一個(gè)不存在的記錄
>> User.find(2) # raises an exception
>> User.find_by_id(2) # nil
>> User.where(id: 2).first # nil
所以這里,很明顯當(dāng)你使用find搜索不存在的記錄時(shí),你會(huì)得到一個(gè)異常。該異常是ActiveRecord :: RecordNotFound,它在生產(chǎn)環(huán)境中呈現(xiàn)404。
總結(jié):find: 根據(jù)id查找,返回一個(gè)對(duì)象
????????????find_by_*: 返回一個(gè)對(duì)象
????????????find_all_by_*:返回Array
????????????where: 返回ActiveRecord::Relation,操作對(duì)象時(shí)才執(zhí)行SQL
4.helper和helper_method究竟做什么?(google的翻譯真的睿智)
helper_method?很簡單:它使部分或全部控制器的方法可用于視圖。
什么是helper?它將輔助方法導(dǎo)入文件或模塊?(也許是名字helper和helper_method相似。他們可能更愿意share_methods_with_view和import_methods_from_view)
自由體會(huì)吧雖然還是云里霧里。
5. || =是什么?
def current_user
?@current_user ||= session[:user_id] && User.find(session[:user_id])
end
這句代碼相當(dāng)于
def current_user
? if @current_use? ?
? ? return @current_user
? ?else
? ? ? if session[:user_id]
? ? ? ? ? @current_user = User.find(session[:user_id])
? ? ? ?else
? ? ? ? ? @current_user = nil
? ? ? ?end
? ? ? ?return @current_user
? ? end
end
代碼意思為:如果@current_user不為空直接返回@current_user。如果@current_user為空,則根據(jù)session中的user_id判斷是否登錄,如果已經(jīng)登錄則查找出用戶信息并返回。如果沒有登錄則返回空。
6.blank?是什么
blank? 相當(dāng)于同時(shí)滿足 .nil? 和 .empty? 。railsAPI中的解釋是如果對(duì)象是:false, empty, 空白字符. 比如說: "", " ", nil , [], 和{}都算是blank。 (object.blank? 相當(dāng)于 object.nil?||object.empty?)。栗子:我相信大家一定都能理解在製作動(dòng)態(tài)功能網(wǎng)站時(shí)類似申請使用者帳號(hào)密碼的場景,密碼字元不能是nil或empty?;虬膊蹇瞻祖I。這在rails裡可以直接整合成blank?()功能喔(真是太方便了?。?/p>
7.config/routes的寫法
在Routes配置文件中,越靠上的一行配置擁有越高的優(yōu)先級(jí)。
對(duì)現(xiàn)階段位的我來說解析的很清楚:https://blog.csdn.net/ysjian_pingcx/article/details/51154488