为什么在 rails 控制器中为 CREATE 而不是 NEW 使用强参数?

why strong parameters for the CREATE, but not NEW, in a rails controller?

我很困惑,为什么在示例文章控制器中,create 方法使用强参数,而 new 方法不是吗?

   def new
        @article = Article.new
    end

    def create
        @article = Article.new(article_param)
        if @article.save
            redirect_to @article
        else
            render "new"
        end
    end

new 方法只是实例化了一个新对象。 create方法负责分配属性并写入数据库。

调用 .new 后,您的文章只是一个空文章 shell,因此不需要任何参数。

使用新文章以便页面可以呈现正确的表单。此外,在新操作中,控制器中没有任何参数,用户只需单击一个新按钮,这样他们就可以接收视图来创建新文章。

您的参数代表用户输入的数据,在提交表单后才存在。

新方法是用户输入数据的表单本身。它是通过创建方法提交的,您的应用程序将在其中识别您的表单规范,并接受或拒绝用户输入的元素。例如,如果您将一个整数分配给 table 元素并且用户在您的表单中输入 float/decimal ,则新表单将接受输入但实际上只为输入的数字创建一个没有小数点的整数它在视图中呈现。

因为 strong_parameters 在更新或创建记录之前有白名单参数。虽然在 newedit 操作上没有对数据库记录的任何操作,并且没有必要将任何参数列入白名单。在 updatecreate 控制器操作上有对数据库的操作,并且禁止任何未列入白名单的参数。

rails guides显示相同的定义:"With strong parameters, Action Controller parameters are forbidden to be used in Active Model mass assignments until they have been whitelisted. This means you'll have to make a conscious choice about which attributes to allow for mass updating and thus prevent accidentally exposing that which shouldn't be exposed."

最常见的示例是:在您的浏览器中,您可以编辑字段名称并将 <input name=user[name] ...> 更改为 <input name=user[admin] ...>,然后在表单中将值更改为“1”并提交。没有强参数 user[:admin] 是一个有效参数并在数据库中被更改。此外,在 newedit 操作中,不存在对数据库产生任何影响的风险,因为您只是向浏览器发送表单。