繁体   English   中英

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的布尔值列控制。 自然,您无法通过该个人资料编辑用户界面将用户设为管理员,因为没有复选框。 但是,恶意用户可以伪造自己喜欢的请求并发送数据,就好像这样的复选框一样。 并且您会盲目接受它并使其成为管理员。

使用强大的参数,您可以将要处理的数据列入白名单

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

在此,即使请求中存在is_admin参数,也会将其丢弃并在更新操作中不使用。

如您所见,您的问题中的代码不会受到影响,因为存在“自然的”白名单。

强参数仅用于批量分配。 就像您手动传递每个单独的属性一样,您根本不需要使用强参数。 这将起作用:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM