Rails中具有散列的未允许参数

时间:2016-06-23 08:42:22

标签: ruby-on-rails ruby hash parameters

我的Rails模型中有一个哈希字段,我正在尝试更新它。 属性detail首先通过迁移生成为text类型。在我的模型中,通过hash属性

将其设置为store :detail
class Request < ActiveRecord::Base
    store :detail
end

我的强项是如此:

params.require(:request).permit(:name, :action, :detail => {})

但是,当我的参数按

进行时
Parameters: {"request"=>{"name"=>"temp", "action"=>"create", "detail"=>{"test"=>"fdsf"}}}

我被告知有一个Unpermitted parameter: test,尽管test参数是detail哈希的一部分。

我该如何解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:6)

params.require(:request).permit(:name, :action, detail: [:test])

另一个选项(例如,如果您事先不知道可能的字段名称)将在客户端序列化detail到json字符串,接受它作为字符串并在之后反序列化为哈希。

答案 1 :(得分:0)

这个(相当古老的)issue非常有趣地解决了你的问题

考虑到您的哈希值包含的值多于SELECT DATE(flightvalidate) AS flightValidateDate, Count(flightid) AS count FROM flight WHERE flightstatus = 0 AND flightvisibility = 1 AND DATE(flightvaliddate) >= CURDATE() - INTERVAL 1 MONTH GROUP BY flightValidateDate ORDER BY flightvalidate ,您可以尝试使用:test

的解决方案
.tap

或稍微不那么动态:

params.require(:request).permit(:name, :action).tap do |whitelisted|
  whitelisted[:detail] = params[:request][:detail]
end

这个blogpost总结了不同的方法。

修改

您需要params.require(:request).permit(:name, :action, :detail => [:test]) 列的类型为&#39; text&#39;能够将哈希保存为字符串。在您的detail模型中,将其添加到顶部:

Request

因为它允许将字符串化的serialize :detail 解释为哈希