2

我有一个Course属于一个模型Grade。我正在尝试通过以下方式create在我的种子.rb 文件中学习课程:

Course.create(
  ActionController::Parameters.new(
    grade: Grade.all.sample
  ).permit(:grade_id)
)

这会创建一个新Course对象,但grade_id它是 nil。我究竟做错了什么?

4

3 回答 3

4

强参数做两件事:一是参数方面的白名单(所以哈希中的键必须匹配传递给允许的参数,即使设置grade最终设置grade_id

它所做的第二件事是限制传递的参数类型 - 当攻击者能够将参数设置为精心构造的哈希/数组/等时,最近发生了许多安全问题,而您只期望一个字符串或一个号码。

结果,任何不是标量值的东西都会被剔除,只有当您表明您需要一个数组/散列时才允许使用数组/散列。特别是您的 activerecord 对象将被剥离。

您可以切换到设置,grade_id而不是在这里使用强参数 - 在这种情况下没有不受信任的用户输入。

于 2013-06-07T14:05:10.873 回答
2

@Frederick Cheung 击败了我。我将通过提供 Rails 控制台的一些输出来补充他的答案以支持这一点。

它不允许记录实例

[11] pry(main)> u = User.first
  User Load (0.5ms)  SELECT "user_users".* FROM "users" ORDER BY "users"."id" ASC LIMIT 1
=> #<User id: 1, ...>
[12] pry(main)> x = ActionController::Parameters.new(user: u)
=> {"user"=>
  #<User id: 1, ...>}
[13] pry(main)> x.permit(:user)
Unpermitted parameters: user
=> {}

但是,如果我们切换到记录 id 的标量整数值,它就可以正常工作。

[14] pry(main)> x = ActionController::Parameters.new(user: u.id)
=> {"user"=>1}
[15] pry(main)> x.permit(:user)
=> {"user"=>1}
于 2013-06-07T14:06:59.923 回答
0

如果您正在创建 Course 实例来播种数据库,那么您不需要从 ActionController::Parameters 创建它

您可以像这样简单地将属性传递给 Course.create:

Course.create(grade: Grade.all.sample)

由于您根本不会使用 ActionController::Parameters,因此您根本不需要担心强参数或许可(在您的种子中)。

于 2013-09-17T02:09:54.287 回答