我目前正在关注rails的教程,教师到目前为止已经很好地解释了大部分事情。目前,他正在教我们如何使我们自己的表单从头开始添加到数据库中,但是我对下面的代码中article_params
的确切目的感到困惑,这里是{{的完整代码1}}处理表单的文件
articles_controller.rb
我理解我们在大多数情况下正在做什么,但是当我有更新和创建操作时,私有方法class ArticlesController < ApplicationController
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
render plain: article[:id].inspect
if @article.save
flash[:notice] = "Article was sucessfully created"
redirect_to article_path(@article)
else
render 'new'
end
end
def show
@article = Article.find(params[:id])
end
def edit
@article = Article.find(params[:id])
end
def update
@article = Article.find(params[:id])
if @article.update(article_params)
flash[:notice] = "Article was sucessfully updated"
redirect_to article_path(@article)
else
render 'edit'
end
end
private
def article_params
params.require(:article).permit(:title,:description)
end
end
在这里做什么?教练说它用于白名单,并继续说几件我真的无法理解的事情。例如,我们为什么要article_params
,而不是if @article.update(article_params)
?如你所见,我对此非常困惑。
谢谢!
答案 0 :(得分:1)
简而言之,您不希望接受来自电汇的每个值。
每当您处理用户输入时,您应该注意将所需参数列入白名单。
article_params
确保您只允许mass assignment
所需的某些属性。假设您有一个admin
字段,它是一个布尔值(不应被任何标准用户修改),如果你这样做
User.create(params[:article])
如果不注意用户发送给服务器的值,您可能会意外地允许该用户成为管理员。看起来像一个弱小的例子,但如果你不小心可能会发生。
在您的代码中,article_params
方法返回一个只有密钥title
和description
的哈希值,并过滤其余的键值对。
要显示从form
实际收到的内容,请使用以下内容替换create
操作。在此之前,请从description
方法中的允许参数中删除article_params
。
def create
render text: params
end
现在,如果您尝试创建表单,则可以找到收到的值。您还可以在服务器日志中查看值,但这是最简单的方法。
然后将您的create method
替换为
def create
render text: article_params
end
您可以发现前一种方法会显示description
,但后者不会过滤它。
从文档中
动作控制器参数
允许您选择应将哪些属性列入白名单以进行批量更新,从而防止意外暴露不应公开的属性。为此提供两种方法:require和permit。前者用于根据需要标记参数。后者用于将参数设置为允许,并限制应该允许哪些属性进行批量更新。
要了解save
和update
之间的区别,请阅读
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save
http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update
希望这有帮助!