問題描述
二刷的時候做作業(yè), 完成edit的功能后, 在"測試"過程發(fā)現(xiàn)用類似
http://localhost:3000/groups/13/posts/19/edit
這樣找到ID的情況下, 能走后門的辦法. 讓賬戶B可改動賬戶A創(chuàng)建的文章, 而且, 走后門改動后, 屬于A的post也變成屬于B的post了, 創(chuàng)建人的變化導(dǎo)致在account/post/index顯示的post也一直變化.... 這次做作業(yè)的時候發(fā)現(xiàn)了 如何不讓走后門改動的文章的創(chuàng)建人從A也變成B
部分解決辦法
辦法就是 別加
@post.user = current_user
這條代碼在create的定義中時能錨定創(chuàng)建人是哪個. 在update的定義中, 加這個就會導(dǎo)致"走后門改動"的同時,創(chuàng)建人也改動成current user了...
剩下的問題
雖然解決了創(chuàng)建人變動的問題, 但是...就算在controller里面加入了參考教材5.5的限制條件, 也無濟(jì)于事...還是能走后門改動...controller改動沒有作用的話...
解決思路
現(xiàn)在懷疑...是不是model中也要動手腳, 畢竟算是data的問題, 限制條件寫在model中才能真正的阻止, 光在controller里面寫是不夠的. 參考了教程5.4后, 推測估計要新增一個column是user_id這樣才能保障把user跟post鏈接起來? 不過, 之前創(chuàng)建post的model時...有設(shè)user的欄位啊...所以...到底...
或者是, 問題出在"記錄誰是post的創(chuàng)建人"這個步驟沒有寫完善?(不太可能? 因為畢竟去掉@post.user=current_user后 創(chuàng)建人也沒有再變動了, 所以創(chuàng)建人應(yīng)該是被正確錨定的)
實操目的
推測是因為雖然有user_id這個欄位, 但是沒有做好post跟user的鏈接工作, data間的關(guān)系沒有在model里定義清晰, 所以導(dǎo)致的問題. 那么, 開始動手嘗試這個猜測吧
Action!
First Round
自己推測是否因為數(shù)據(jù)鏈接不清晰, 導(dǎo)致不能正確抓取post的creator數(shù)據(jù).?
在model以及controller都不動的前提下, 直接去view里加一個顯示欄位, 加了截圖中的兩個紅框中的代碼, 結(jié)論是抓取的數(shù)據(jù)是對的...
Second Round?
嗯...那么推測是controller里的代碼寫的不妥
這個還要怎么改才能起到限定作用...開始嘗試吧...
改成?
if current_user =! @group.post.user?
直接報錯了...加一個group是錯的...那...還要怎么表示"非post內(nèi)容的創(chuàng)建人"不可改動啊啊啊
Third Round?
不然...是routes的關(guān)系?嗯...感覺思路不太對...但是管他的, 玩起來
嗯, 加了也沒有用, 還是可以從B走后門改動A創(chuàng)建的post內(nèi)容...唉...
Fourth Round?
再試! 應(yīng)該是controller代碼沒寫好...唉...如果再玩一小時還是沒結(jié)論, 就四刷的時候再回頭解決吧...
調(diào)整代碼順序也沒有改變, 調(diào)整edit的位置 放到"new" "create"之間也沒改變...B還是能改A創(chuàng)建的post內(nèi)容
Final Try
搞定了...你猜猜什么問題...本來想說繼續(xù)進(jìn)攻controller, 接著改一下順序吧, 想把
if current_user =! @post.user
改成
if @post.user =! current_user?
試試看, 符號前后對象互相調(diào)換位置會啥效果, 正換位置呢, 卻先發(fā)現(xiàn)...符號才是要調(diào)整的問題...我之前寫的是
=!
其實應(yīng)該是?
!=
啊啊啊啊啊啊啊啊啊啊!!! 居然是這么吐血的簡單拼寫錯誤!!! "不等于"的符號改對了之后, 立馬就搞定了
順便一說, 改成if @post.user != current_user 前后對象互換也是能正常執(zhí)行code的, 有點(diǎn)意思.
搞定!!! 8.3的課外作業(yè)在三刷的時候, 終于完整的搞定了.?