Ruby on rails 如何从ActionController::Parameters中删除对象?

Ruby on rails 如何从ActionController::Parameters中删除对象?,ruby-on-rails,ruby-on-rails-5,strong-parameters,actioncontroller,Ruby On Rails,Ruby On Rails 5,Strong Parameters,Actioncontroller,我正试图从ActionController::Parameters对象中删除一个元素,但它没有像我预期的那样工作。我的报告参数对象如下所示 <ActionController::Parameters {"id"=>"51956915", "author_id"=>"1", "workout_attributes"=><ActionController::Parameters {"player_id"=>"14155", "date"=>"2017-10-

我正试图从ActionController::Parameters对象中删除一个元素,但它没有像我预期的那样工作。我的
报告参数
对象如下所示

<ActionController::Parameters {"id"=>"51956915", "author_id"=>"1", "workout_attributes"=><ActionController::Parameters {"player_id"=>"14155", "date"=>"2017-10-09", "report_id"=>"51956915"} permitted: true> permitted: true>
这将返回下面的信息,但当我重新运行
report\u params

<ActionController::Parameters {"player_id"=>"14155", "date"=>"2017-10-09", "report_id"=>"51956915"} permitted: true>
更新 以下是来自控制器的报告参数方法:

def report_params
  params.require(:report).permit(:id, :author_id, 
        workout_attributes: [:player_id, :report_id, :date]
        )
end
因此,是否不允许我编辑
报告参数
对象,我需要复制该对象,然后将该副本传递给操作中的更新函数?还是有什么事情我做得不对?谢谢

使用“有效”解决方案更新

我发现,如果我执行以下操作,基本上是复制参数,然后编辑和传递-它会起作用。但是,如果可以使用实际的原始params对象来完成,那么这似乎是一个丑陋的代码

  modified_report_params = report_params
  modified_report_params.extract!(:workout_attributes)

  respond_to do |format|
    format.js do
      if @report.update(modified_report_params)
      # ...
  end

允许参数将创建一个新对象:

params = ActionController::Parameters.new(a: 1, b: 2)
params.object_id
#=> 70277626506220
params.permit(:a, :b).object_id #new object created
#=> 70277626332020
如您所见,每次调用
report_params
时,都会从
params
创建一个新对象。要解决问题,您可以对
params
本身进行变异:

params.extract!(:workout_attributes)
或者,通过使用备忘录:

def report_params
  @report_params ||= params
    .require(:report)
    .permit(:id, :author_id, workout_attributes: [:player_id, :report_id, :date])
end
report_params.extract!(:workout_attributes)
#=><ActionController::Parameters {"player_id"=>"14155", "date"=>"2017-10-09", "report_id"=>"51956915"} permitted: true>
def报告参数
@报告参数=参数
.require(:报告)
.permit(:id,:author\u id,workout\u属性:[:player\u id,:report\u id,:date])
结束
报告参数摘录!(:训练属性)
#=>“14155”,“日期”=>“2017-10-09”,“报告id”=>“51956915”}允许:真>
只需使用,而不是
#提取

除(*键) 返回一个散列,该散列包含除给定键以外的所有内容

这对我很有用:

params.except(:password)

ActionController::Parameters
不再从Rails 5中的HashWithInferenceAccess继承。但是这个类有自己的方法
,除了
,true。
def report_params
  @report_params ||= params
    .require(:report)
    .permit(:id, :author_id, workout_attributes: [:player_id, :report_id, :date])
end
report_params.extract!(:workout_attributes)
#=><ActionController::Parameters {"player_id"=>"14155", "date"=>"2017-10-09", "report_id"=>"51956915"} permitted: true>
respond_to do |format|
  format.js do
    if @report.update(report_params.except(:workout_attributes))
      # ...
    end
  end
end
params.except(:password)