Ruby on rails 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项目转换为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 => 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)