回调是被称为在对象的生命周期中的一些点的方法。 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
方法直接在对象上调用私有方法,但你不应该担心这个方法