Ruby on rails Rails 3创建到Rails 4强参数
我正在将我的Rails 3项目转换为Rails 4,但我对Ruby on rails Rails 3创建到Rails 4强参数,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,strong-parameters,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,Strong Parameters,我正在将我的Rails 3项目转换为Rails 4,但我对强参数感到困惑 以下是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 =>
强参数
感到困惑
以下是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)
它很好用。但在我在rails4
中修改成这种方式之后,它就错了
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>
只有
gamecharacter\u 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
param,它也将被丢弃,不会在更新操作中使用
正如您所看到的,问题中的代码不会受到这种影响,因为存在“自然”白名单。强参数仅用于大规模赋值。由于您正在手动传递每个单独的属性,所以根本不需要使用强参数。这将有助于:
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)
您只是从
参数中获取:name
其他值从何而来?请添加代码,仅供参考,您可以在参数上调用require
,而不是在哈希上。谢谢,我已更新了我的问题。抱歉,我已更新了我的问题。只有gamecharacter\u id
不是来自params
@CodaChang:不会改变任何东西。你看过答案了吗?是的,我看过答案了。我只是想确定一下。谢谢你的耐心。
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)