【问题标题】:Rails 3 create to Rails4 strong parameterRails 3 创建到 Rails4 强参数
【发布时间】:2017-02-09 09:20:38
【问题描述】:

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

【问题讨论】:

  • 您只是从params 中获取:name,其他值从何而来?
  • 请添加代码
  • 而且仅供参考,您可以在参数上调用require,而不是在哈希上
  • 谢谢,我已经更新了我的问题。

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4 strong-parameters


【解决方案1】:

您误解了强参数的目的。它们用于白名单传入数据。但是由于您已经这样做了(通过构建该哈希),因此您不需要强大的参数。

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 参数存在于请求中,它也会被丢弃并且不会在更新操作中使用。

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

【讨论】:

  • 抱歉,我已经更新了我的问题。只有gamecharacter_id 不是来自params
  • @CodaChang:不会改变任何东西。你看答案了吗?
  • 是的,我已经阅读了答案。我只是想确定一下。感谢您的耐心等待。
【解决方案2】:

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多