在Rails中更新和创建表单(理解一些代码)

时间:2016-08-18 01:11:07

标签: ruby-on-rails

我目前正在关注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)?如你所见,我对此非常困惑。

谢谢!

1 个答案:

答案 0 :(得分:1)

简而言之,您不希望接受来自电汇的每个值

每当您处理用户输入时,您应该注意将所需参数列入白名单。

article_params确保您只允许mass assignment所需的某些属性。假设您有一个admin字段,它是一个布尔值(不应被任何标准用户修改),如果你这样做

User.create(params[:article])

如果不注意用户发送给服务器的值,您可能会意外地允许该用户成为管理员。看起来像一个弱小的例子,但如果你不小心可能会发生。

在您的代码中,article_params方法返回一个只有密钥titledescription的哈希值,并过滤其余的键值对。

要显示从form实际收到的内容,请使用以下内容替换create操作。在此之前,请从description方法中的允许参数中删除article_params

def create
  render text: params
end

现在,如果您尝试创建表单,则可以找到收到的值。您还可以在服务器日志中查看值,但这是最简单的方法。

然后将您的create method替换为

def create
  render text: article_params
end

您可以发现前一种方法会显示description,但后者不会过滤它。

从文档中

  

动作控制器参数

     

允许您选择应将哪些属性列入白名单以进行批量更新,从而防止意外暴露不应公开的属性。为此提供两种方法:require和permit。前者用于根据需要标记参数。后者用于将参数设置为允许,并限制应该允许哪些属性进行批量更新。

要了解saveupdate之间的区别,请阅读 http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update

希望这有帮助!