[英]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.