我有Course
模型,其属于Grade
。我正在尝试通过:
create
一个课程
Course.create(
ActionController::Parameters.new(
grade: Grade.all.sample
).permit(:grade_id)
)
这会创建一个新的Course
对象,但grade_id
为零。我做错了什么?
答案 0 :(得分:4)
强参数有两个作用:一个是事物参数的白名单(因此哈希中的键必须与传递给permit的参数匹配,即使设置grade
最终设置为grade_id
它做的第二件事是限制传递的参数类型 - 当你只期望攻击者能够将参数设置为精心构造的哈希/数组/等时,会发生许多最近的安全问题字符串或数字。
因此,任何不是标量值的内容都会被删除,只有在你表明你期望数组/哈希时才允许使用数组/哈希。特别是您的activerecord对象将被删除。
您可以切换到设置grade_id
而不是在这里不使用强参数 - 在这种情况下没有不受信任的用户输入。
答案 1 :(得分:2)
它不允许记录实例
[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}
答案 2 :(得分:0)
如果要创建一个Course实例来为数据库设定种子,那么您不需要从ActionController :: Parameters
创建它您只需将属性传递给Course.create,如下所示:
Course.create(grade: Grade.all.sample)
由于您根本不会使用ActionController :: Parameters,因此您无需担心强参数或许可(在种子中)。