【问题标题】:RoR - Removing an array element from ActionController::ParametersRoR - 从 ActionController::Parameters 中移除一个数组元素
【发布时间】:2017-01-19 20:33:20
【问题描述】:

在我的 Rails 3.2 应用程序中,我在控制器中获取了 params 变量,如下所示:

params.class         => ActionController::Parameters
params[:a].class     => ActionController::Parameters
params[:a][:b].class => Array
params[:a][:b]       => ['1', '2', '3', '4']

当我尝试删除数组中的一个值时,它没有正确反映。

例如

params[:a][:b].delete('1') 
=> "1"

但是当我再次查询它时,它没有任何变化。

params[:a][:b]   => ['1', '2', '3', '4']

虽然,如果我将它重新分配给一个变量,它工作正常。

arr = params[:a][:b]
arr.delete('1')
=> "1"

arr
=> ['2', '3', '4']

知道为什么我不能直接更新params 对象吗?

【问题讨论】:

  • 你可以只发布params 值吗?
  • 我无法重现这个:params[:a][:b] == ['1', '2']; params[:a][:b].delete('1'); params[:a][:b] == ['1', '2']。我怀疑你已经覆盖了一些有趣的东西,而params 所做的事情超出了我的预期。你能发布完整的、相关的、控制器代码吗?理想情况下是可重现的。
  • 当你arr = params[:a][:b] ; arr.delete('1'); params[:a][:b] = arr; params[:a][:b] 时会发生什么?
  • 你确定你有 3.2 rails 应用程序吗? AFAIR ActionController::Parameters 在 rails 4 中引入。在 3.2 中,参数应具有以下类 ActiveSupport::HashWithIndifferentAccess
  • 你搞定了吗?

标签: ruby-on-rails arrays ruby ruby-on-rails-3 actioncontroller


【解决方案1】:
params[:a][:b].tap { |ary| ary.delete('1') }
#=> ['2', '3', '4']

要更改 params[:a][:b] 的值,您需要为其分配一个新值:

params[:a][:b] = params[:a][:b].tap { |ary| ary.delete('1') }

【讨论】:

  • 但这和params[:a][:b].delete('1')有什么区别?如果后者不起作用,为什么您的代码会起作用?我无法重现该问题。
  • @TomLord 启动控制台并查看差异 ;)
  • 返回值不同,当然。但是 params 哈希的突变不会 - 这是重要的事情。
  • @TomLord 感谢您的评论我刚刚意识到我没有完成答案编辑(没有在另一个浏览器窗口中单击save edit)。谢谢!
  • 抱歉,我仍然看不出你的代码有什么不同,只是写了params[:a][:b].delete('1')。注意Array#delete 变异对象;它不会像大多数其他非爆炸方法一样返回新对象。
猜你喜欢
  • 2018-03-21
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多