Rails 3 创建到 Rails4 强参数

Rails 3 create to Rails4 strong parameter

我正在将我的 Rails 3 项目转换为 Rails4,但我对 strong parameter 感到困惑。

这里是原代码Rails 3

series_mission = SeriesMission.create({name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time, end_time: end_time, gamecharacter_id: gc.id}, :without_protection => true)

它工作正常。但是我在Rails 4.

中修改成这样后就不对了
attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
     end_time: end_time, gamecharacter_id: gc.id }
attrs = attrs.require(:series_mission).permit(:name, :mode, :start_time, :end_time, :gamecharacter_id)
series_mission = SeriesMission.create(attrs)

它抛出了这个错误

private method `require' called for #<Hash:0x007fd2a421e8b8>

更新

qset_ids = params[:sub_missions]
start_time = ((t = params[:start_time].to_i) == 0 ? nil : Time.at(t))
end_time = ((t = params[:end_time].to_i) == 0 ? nil : Time.at(t))

只有gamecharacter_id没有路过params

您误解了强参数的用途。它们用于 白名单 传入数据。但是既然你已经这样做了(通过构建哈希),你不需要强参数。

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
     end_time: end_time, gamecharacter_id: gc.id }
series_mission = SeriesMission.create(attrs)

什么意思,白名单?

假设您有一个个人资料编辑页面。在那里您可以更改名称和图片。您应用中的某些用户可以是管理员。此状态由数据库中的布尔列 is_admin 控制。当然,您不能通过个人资料编辑 UI 让用户成为管理员,因为没有复选框。但是,恶意用户可以随心所欲地伪造请求并发送数据,就像 这样的复选框一样。你会盲目地接受它并让他们成为管理员。

有了强大的参数,你白名单你想要处理的数据

params.require(:user).permit(:name, :picture)

这里,即使请求中有is_admin参数,它也会被丢弃,不会在更新操作中使用。

如您所见,您问题中的代码不受此影响,因为存在 "natural" 白名单。

强参数仅用于 mass-assignment。看到您手动传递每个单独的属性时,您根本不需要使用强参数。这将起作用:

attrs = { name: params[:name], mode: Mission.mode_mapping(params[:mode].to_s), start_time: start_time,
 end_time: end_time, gamecharacter_id: gc.id }

series_mission = SeriesMission.create(attrs)