我有一个Course
属于一个模型Grade
。我正在尝试通过以下方式create
在我的种子.rb 文件中学习课程:
Course.create(
ActionController::Parameters.new(
grade: Grade.all.sample
).permit(:grade_id)
)
这会创建一个新Course
对象,但grade_id
它是 nil。我究竟做错了什么?
我有一个Course
属于一个模型Grade
。我正在尝试通过以下方式create
在我的种子.rb 文件中学习课程:
Course.create(
ActionController::Parameters.new(
grade: Grade.all.sample
).permit(:grade_id)
)
这会创建一个新Course
对象,但grade_id
它是 nil。我究竟做错了什么?
强参数做两件事:一是参数方面的白名单(所以哈希中的键必须匹配传递给允许的参数,即使设置grade
最终设置grade_id
。
它所做的第二件事是限制传递的参数类型 - 当攻击者能够将参数设置为精心构造的哈希/数组/等时,最近发生了许多安全问题,而您只期望一个字符串或一个号码。
结果,任何不是标量值的东西都会被剔除,只有当您表明您需要一个数组/散列时才允许使用数组/散列。特别是您的 activerecord 对象将被剥离。
您可以切换到设置,grade_id
而不是在这里使用强参数 - 在这种情况下没有不受信任的用户输入。
@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}
如果您正在创建 Course 实例来播种数据库,那么您不需要从 ActionController::Parameters 创建它
您可以像这样简单地将属性传递给 Course.create:
Course.create(grade: Grade.all.sample)
由于您根本不会使用 ActionController::Parameters,因此您根本不需要担心强参数或许可(在您的种子中)。