如何用对象数组做强参数

Pet*_*r R 6 ruby-on-rails ruby-on-rails-5

如果我有用户

def user_params
    params.require(:user).permit(:name, :age)
end
Run Code Online (Sandbox Code Playgroud)

我记下了。我想批量创建用户。因此,用户可以填写用户列表(理论上是无穷无尽的),他们将输入为:

[{name: "name", age: 12},{name: "name", age: 22},{name: "name", age: 32}]
Run Code Online (Sandbox Code Playgroud)

问题是,我如何为此使用强参数?我知道我可以循环遍历数组并创建记录,我明白了。我的理解是,强参数通常是一个好主意,安全方面。

什么是强大的参数保护我免受伤害?如果我只是遍历用户数组,我会在这里打开什么?我怎样才能正确地做到这一点,要么使用强参数,要么使用替代方法?

C d*_*VII 6

完整的强参数点(在 rails 4 中引入),目的是保护应用程序免受大规模分配漏洞的影响。例如,假设您有一个User模型并且它有一个admin属性。如果您在理论上使用批量分配,如果您没有以某种方式过滤掉它,那么有人可能会为 admin 属性输入一个值;见下文

class UserController < ApplicationController

  def create
    #{name: 'Joe', score: 7, title: 'Mr', admin: true} params hash
    User.create(params)
  end
end
Run Code Online (Sandbox Code Playgroud)

现在,如果你的应用程序的用户如何传递这些值,他们只是让自己和管理员可以做他们想做的事。所以这就是为什么你会使用强参数来做到这一点。

class UserController < ApplicationController

  def create
    User.create(user_params)
  end

  def user_params
    params.require(:name).permit(:title, :score)  #noticed admin is not allowed
  end
end
Run Code Online (Sandbox Code Playgroud)

现在要使用强参数创建多个记录,您可以执行此操作

class UserController < ApplicationController

  def create
    user_params[:users].each do |u|
      User.create(u)
    end
  end

  def user_params
    params.permit(:users, array: [:name, :age])
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我也在努力解决同样的问题,我认为正确的答案是使用 `params.permit(:users =&gt; [:name, :age])`。仅供参考,供其他遇到此答案的人参考。 (2认同)