2011-07-30 55 views
203

任何人都可以在Rails控制器中解釋params:它們來自哪裏以及它們所引用的內容?Rails params解釋?

def create 
    @vote = Vote.new(params[:vote]) 
    item = params[:vote][:item_id] 
    uid = params[:vote][:user_id] 
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid]) 
    last_vote_time = @extant.created_at unless @extant.blank? 
    curr_time = Time.now 
    end 

我希望能夠逐行閱讀這段代碼並理解發生了什麼。

+2

服務器端Web開發的背景是什麼?你已經知道哪些技術? –

+3

我一直使用HTML和CSS多年。採用了使用PHP,JS和Java的類。儘管使用了很少的MVC。我真的使用Java學習編程。我完全理解數據庫理論。 – Dru

回答

251

參數來自用戶的瀏覽器,當他們請求頁面時。對於最常見的HTTP GET請求,參數在url中編碼。例如,如果用戶的瀏覽器請求

http://www.example.com/?foo=1&boo=octopus

然後params[:foo]將是「1」,params[:boo]將是「章魚」。

在HTTP/HTML中,參數實際上只是一系列鍵和值對,其中鍵和值都是字符串,但Ruby on Rails有一個特殊的語法來使得參數成爲哈希值。例如,如果用戶的瀏覽器請求

http://www.example.com/?vote[item_id]=1&vote[user_id]=2

然後params[:vote]將是一個散列,params[:vote][:item_id]將是「1」和params[:vote][:user_id]將是「2」。

Ruby on Rails參數相當於$_REQUEST array in PHP

+11

相當於$ _REQUEST,只是$ _REQUEST包含get,post和cookie數據,而params只能獲取和發佈數據。 – Parziphal

+3

@renocor POST數據也包含在Rails的'params'哈希中。 Cookie數據包含在'session'哈希中。 –

+0

這個答案留下了另一個參數來源:URL。有關更多信息,請參閱hammar的答案。 –

13

基本上,參數是用戶指定的數據到rails應用程序。

當您發佈表單時,通常使用POST請求來執行,而不是GET請求。當您瀏覽網站時,您可以將普通的rails請求視爲GET請求,如果有幫助的話。

當您提交表單時,控件將被拋回到應用程序中。你如何得到你提交給表單的值? params是如何。

關於您的代碼。 @vote = Vote.new params[:vote]使用params [:vote]的數據創建新的數據庫表決。鑑於你的表單用戶提交的名稱是:vote,它的所有數據都在這個hash表單中。

接下來的兩行是用來獲取item和uid用戶已經提交到表單的。

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid]) 

從條件item_id = item和user_id = uid的數據庫中查找最新或最後插入的投票。

下一行代表最後的投票時間和當前時間。

70

正如其他人指出的那樣,params值可能來自GET請求的查詢字符串或POST請求的表單數據,但也可能來自第三方:URL的路徑。如您所知,Rails使用稱爲路由的東西將請求引導至相應的控制器操作。這些路線可能包含從URL中提取並放入params的段。舉例來說,如果你有這樣的路線:

match 'products/:id', ... 

然後到一個URL的請求喜歡http://example.com/products/42將設置params[:id]42

43

PARAMS包含以下三組參數:

  1. 用戶提供的參數
    • GET http://domain.com/url?param1=value1&param2=value2將設置PARAMS [:參數1],而params [:參數2])
    • POST (例如JSON,XML將自動解析並存儲在參數中)
    • 注:默認情況下,滑道複製該用戶提供的參數,並將它們存儲在PARAMS [:用戶]如果在UsersController可以與wrap_parameters設置改變
  2. 路由參數
    • match '/user/:id'在路由。 RB將設置PARAMS [:ID]
  3. 默認參數
    • params[:controller]params[:action]總是可用,幷包含電流控制器和動作
+1

你可以在'用戶提供的參數'下擴展你的注意嗎?例如,UsersController中的params散列示例會很有幫助。你的例子聽起來像散列看起來像這樣:'{first_name:「mike」,user:{first_name:「mike」} ...}這是正確的嗎? – 7stud

+0

@ 7stud這是正確的! – thejaz

+1

我在rails4中看不到這個。例如,'{「_method」=>「put」,「authenticity_token」=>「gubHya6uQrQLjPRXhOC0RUuCdn7NFr6CeKrbRfBSHI =」,「熟」=>「真」,「動作」=>「更新」,「控制器」=>「蘋果」 ,「id」=>「4」}'。如果我錯了,請原諒我,我是一名初學者。根據你的說明,我應該看到:'{「_method」=>「put」,「authenticity_token」=>「gubHya6uQrQLjPRXhOC0RUuRdn7NFr6CeKrbRfBSHI =」,「熟」=>「true」,「apple」=> {「ripe」=> 「true」},「action」=>「update」,「controller」=>「apples」,「id」=>「4」}'我不知道這是否與rails4中的_strong parameters_有關。 – 7stud