回調是被稱爲在對象的生命週期中的一些點的方法。 set_article
是一個回調函數,因爲它被稱爲before
特定的控制器操作(通常列在文件頂部)。原因是您需要從數據庫中找到article
,並將其分配給所有這些操作中的實例變量。這個方法是爲了讓代碼保持乾燥(不要重複自己),因爲如果你沒有一個私有的方法,你將不得不復制/粘貼每個控制器動作的方法。這很好,只要你不需要改變它即可。這就是爲什麼對這些類型的方法使用回調是很好的做法。
如前所述,@article = Article.find(params[:id])
在數據庫中找到一篇具有特定ID的文章,並將其分配給一個實例變量,以便稍後在視圖中使用它(例如使用@article.name
等)。
article_params方法做什麼?它需要傳遞給請求的所有參數。然後檢查參數的構造。在這種情況下,params.require(:article).permit(:title, :post, :user_id)
它正在等待看起來像article: { title: "smth", param2: "val2" }
等的參數。這就是.require(:article)
所做的。 permit
所做的除外,其他params
除了您已列入白名單外。
一個例子:
def article_params
params.require(:article).permit(:title, :post, :user_id)
end
而且比方說,一個黑客正在試圖改變禁止的屬性和發送這樣article: { title: "smth", post: "Hacked", user_id: 1, admin_id: 1(hackers user_id) }
的請求。如果你這樣做Article.find(params[:id]).update_attributes(params[:article])
它會嘗試寫數據庫ALLL已傳遞的參數。
如果你有article_params
方法,你用這個來代替原PARAMS:Article.find(params[:id]).update_attributes(article_params)
它會自動下降所有非白名單的參數,可以意味着article_params
將只包含article: { title: "smth", post: "Hacked", user_id: 1}
我希望這是明確的現在。
但是如果定義一些公共法條時,可以使用相同的方法
class Article
def needs_write
#Do other stuff
write
end
private
def write
puts "private"
end
end
然後調用article.needs_write
會工作,並且還會調用write
方法。
最初理解起來有點棘手... +讓你更加困惑 - 事實上,你可以通過send
方法直接在對象上調用私有方法,但你不應該擔心這個方法