Ruby on rails 如何从ActionController::Parameters中删除对象?
我正试图从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 {"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)