使用belongs_to创建强参数

时间:2013-06-07 13:32:47

标签: ruby-on-rails ruby strong-parameters

我有Course模型,其属于Grade。我正在尝试通过:

在我的seeds.rb文件中create一个课程
Course.create(
  ActionController::Parameters.new(
    grade: Grade.all.sample
  ).permit(:grade_id)
)

这会创建一个新的Course对象,但grade_id为零。我做错了什么?

3 个答案:

答案 0 :(得分:4)

强参数有两个作用:一个是事物参数的白名单(因此哈希中的键必须与传递给permit的参数匹配,即使设置grade最终设置为grade_id

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

因此,任何不是标量值的内容都会被删除,只有在你表明你期望数组/哈希时才允许使用数组/哈希。特别是您的activerecord对象将被删除。

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

答案 1 :(得分: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}

答案 2 :(得分:0)

如果要创建一个Course实例来为数据库设定种子,那么您不需要从ActionController :: Parameters

创建它

您只需将属性传递给Course.create,如下所示:

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

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