2013-08-01 121 views
4

所以我已經看到其他人一直在困惑我,我已經閱讀了其他答案,但我仍然困惑。Ruby on Rails教程困惑於Params哈希如何工作

如何在刪除請求期間存儲信息並將其解析到params散列中?我瞭解它如何在向其提交信息方面發揮作用。即當發佈Put,Post或Get請求時,我知道信息通過params散列傳遞給相應的控制器動作。

然而,根據在用戶部分(_user.html.erb)代碼如下:

<li> 
    <%= gravatar_for user, size: 52 %> 
    <%= link_to user.name, user %> 

    <% if current_user.admin? && !current_user?(user) %> 
    <%= link_to "delete", user, method: delete, 
          data: {confirm: "You sure?"} %> 
          <% end %> 
</li> 

和代碼在DESTROY動作被自動路由到:

def destroy 
    User.find(params[:id]).destroy 
    flash[:success] = "User destroyed." 
    redirect_to users_url 
end 

我不明白params散列如何獲取存儲在其中的用戶標識。我會理解,如果它是params [:user] [:id],因爲我們發佈具有屬性列表的用戶。但是,我不明白id如何直接存儲到params散列中。這一直困擾了我一段時間,所以請任何有識之士將不勝感激。

+4

Jake,看看link_to()助手創建的html。另外,如果你想查看參數中的內容,安裝pry(pry-full)(非常有用的gem),並在你的控制器的destroy方法中粘貼一個binding.pry,以查看 –

回答

2

它基於軌道模型。

如果你使用的資源:用戶配置/ routes.db它會創建以下航線(您可以通過運行耙路線查看):

刪除用戶/:ID

符號:ID意味着無論您在用戶/調用url之後添加的參數都將在params中設置爲:id。 (在這種情況下,對於DELETE HTTP動詞)

+1

中通過什麼傳遞,然後你可以用user_path(user )這將返回'用戶/ 13',其中13是user.id! –

+0

謝謝你們。我想我現在得到它。我將不得不開始看看我的代碼生成的實際html的習慣。與答案一起提供了一個相當清晰的情況。再次感謝!! – Jake

3

這是軌道如何工作的方式。如果你做一個rake routes你會看到你得到類似DELETE /users/:id

這意味着您作爲參數傳遞的用戶對象被解釋爲:id。當Rails看到這個時,它會知道它必須查看傳遞的對象的ID,按照慣例,所有的模型都有一個ID字段。

2

因此,Rails會讀入您傳遞給它的URL,然後決定如何處理它。

按照慣例,它會認爲你進入它是什麼

:controller/:id

那麼它可能確實是走在URL作爲一個字符串,並根據/字符休息下來。

在IRB中嘗試此操作。

controller, id = "hello/1".split("\/")

然後鍵入

id

想象,這個新設置的id變量傳遞到params哈希是這樣的:

params = {} 
params[:id] = id 

現在,在

params[:id]

事實是比較複雜的。我正在通過源代碼來查找具體的方法,但有太多事情正在進行。嘗試在ActionDispatch

http://api.rubyonrails.org/classes/ActionDispatch/Routing.html

好運檢查了這個!