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)
我正在将我的 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)