回调&params.require - 有人可以向我解释这些吗?
我道歉,如果这是一个愚蠢的,但我不知道下面这段代码确实回调&params.require - 有人可以向我解释这些吗?
private
# Use callbacks to share common setup or constraints between actions.
def set_article
@article = Article.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def article_params
params.require(:article).permit(:title, :post, :user_id)
end
end
我新的轨道,我已经得到了MVC的一个相当不错的主意,这一切是如何相连,但是我无法将上述代码包裹在控制器文件中找到的上面的代码中。什么是回调,为什么我会用一个?什么是Article.find(params [:id])在干什么? .permit在这种情况下做什么?这是否意味着它只会接受标题,发布& user_id参数,而不是其他任何内容?最重要的是,为什么这两种方法都是私有的?提前致谢!
回调是被称为在对象的生命周期中的一些点的方法。
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}
我希望这是明确的现在。
-
私有方法一般私有方法是,你不能在对象本身之外调用方法。例如,如果
Article
拥有的私有方法write
你不能做:article = Article.new article.write
但是如果定义一些公共法条时,可以使用相同的方法
class Article
def needs_write
#Do other stuff
write
end
private
def write
puts "private"
end
end
然后调用article.needs_write
会工作,并且还会调用write
方法。
最初理解起来有点棘手... +让你更加困惑 - 事实上,你可以通过send
方法直接在对象上调用私有方法,但你不应该担心这个方法
- 这些操作是私人的,因为我们不想在课堂以外访问这些操作。
-
高清set_article @article = Article.find(PARAMS [:编号]) 结束 这个动作演出前运行,编辑,你可以看到在顶部before_action 是一样
高清显示 @article = Article.find(params [:id]) end 我们在编辑和显示中使用相同的东西。所以我们不想重复同样的事情。所以我们把它放在一个行动中。
DEF article_params params.require(:文章).permit(:标题,:交,:USER_ID) 端 这个动作是接受强参数。只有这些参数将允许DATABSE存储