Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么我在Rails 5中的Rails控制台中遇到了严重的参数错误?_Ruby On Rails_Rails Activerecord_Strong Parameters_Awesomeprint - Fatal编程技术网

Ruby on rails 为什么我在Rails 5中的Rails控制台中遇到了严重的参数错误?

Ruby on rails 为什么我在Rails 5中的Rails控制台中遇到了严重的参数错误?,ruby-on-rails,rails-activerecord,strong-parameters,awesomeprint,Ruby On Rails,Rails Activerecord,Strong Parameters,Awesomeprint,我想在我的控制台中调用它(ap是最棒的打印宝石): 但我得到了这个错误: ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash 它的工作原理如下: irb(main):020:0> ap Purchase.last #<Purchase:0x00007f86b792a320> { :id =&g

我想在我的控制台中调用它(
ap
是最棒的打印宝石):

但我得到了这个错误:

ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
它的工作原理如下:

irb(main):020:0> ap Purchase.last
#<Purchase:0x00007f86b792a320> {
                              :id => 28445,
                         :user_id => 10177,
                      :product_id => nil,
                    :product_type => nil,
                           :price => 9.0,
                    :gateway_code => nil,
                     :gateway_msg => nil,
                :gateway_response => nil,
                      :created_at => Fri, 18 May 2018 22:20:10 UTC +00:00,
                      :updated_at => Fri, 18 May 2018 22:20:10 UTC +00:00,
                  :checkout_total => 9.0,
                      :successful => true,
                         :cart_id => 17242,
                   :report_errors => nil,
    :transacted_value_of_products => 9.0,
            :comp_credits_applied => 0.0
}
irb(main):022:0> Purchase.last(10)
D, [2018-05-25T20:58:54.692575 #70552] DEBUG -- :   Purchase Load (0.5ms)  SELECT  "purchases".* FROM "purchases" ORDER BY "purchases"."id" DESC LIMIT $1  [["LIMIT", 10]]
+-------+---------+------------+-------------+-------+-------------+-------------+-------------+-------------+--------------+-------------+------------+---------+-------------+-------------+-------------+
| id    | user_id | product_id | product_... | price | gateway_... | gateway_msg | gateway_... | created_at  | updated_at   | checkout... | successful | cart_id | report_e... | transact... | comp_cre... |
+-------+---------+------------+-------------+-------+-------------+-------------+-------------+-------------+--------------+-------------+------------+---------+-------------+-------------+-------------+
| 28436 | 10471   |            |             | 5.0   |             | Completed   | {"mc_gro... | 2018-05-... | 2018-05-1... | 5.0         | true       | 17228   | {}          | 5.0         | 0.0         |
| 28437 | 9754    |            |             | 1.99  |             | Completed   | {"mc_gro... | 2018-05-... | 2018-05-1... | 2.48        | true       | 15273   | {}          | 1.99        | 0.0         |
| 28438 | 10472   |            |             | 9.0   |             |             | {\n  "id... | 2018-05-... | 2018-05-1... | 9.0         | true       | 17231   | {}          | 9.0         | 0.0         |
| 28439 | 10348   |            |             | 9.0   |             |             |             | 2018-05-... | 2018-05-1... | 9.0         | true       | 17235   |             | 9.0         | 0.0         |
但不能使用参数和
ap

irb(main):021:0> ap Purchase.last(3)
ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
    from (irb):21
结果我什么都做不了:

irb(main):023:0> ap Purchase.find(28444)
ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
    from (irb):23

irb(main):024:0> ap Purchase.find(28444).gateway_response
ActionController::UnfilteredParameters: unable to convert unpermitted parameters to hash
    from (irb):24
发生了什么事?

发生了什么事,为什么
ActionController::Parameters
(这是
params
在控制器中使用的)用于从
hashWithInferenceAccess继承的
Hash
。所以,
ActionController::Parameters
过去是真的,就像:

params.require(:x).permit(some_hash: %i[key1 key2]).is_a? Hash
如果要从
参数中挖掘
散列

some_hash = params.require(:x).permit(some_hash: ...)
并在模型中序列化:

class M < ApplicationRecord # Or ActiveRecord::Base in the past
  serialize :h, Hash
end
#...
m.h = some_hash
而不是预期的普通哈希

但后来Rails5出现了:

  • 使
    ActionController::Parameters
    不再继承自
    hashWithInferenceAccess
ActionController::Parameters
上调用
to_h
to_hash
会引发异常

如果升级代码并尝试加载包含序列化数据的模型:

serialize :h, Hash
然后,模型将从
h
加载文本,解析YAML以获得
ActionController::Parameters
实例,并调用
以确保它有一个散列,然后您将得到一个异常

怎么办 您需要做几件事:

  • 修复控制器,确保它们从
    params
    中得到真正的哈希值
  • 修复数据,以便序列化哈希,而不是
    ActionController::Parameters
    实例
  • 修复控制器很简单,只需调用
    对尚未成为真正散列的参数执行\u unsafe\u h

    修复数据更难看。我可能会使用低级数据库接口(即任何地方都没有ActiveRecord)浏览这些表,从每一行读取YAML,
    YAML.load
    it,通过调用
    to\u unsafe\u h
    将其转换为散列,然后将
    实散列写回\u YAML
    文本。您可以使用像'--'这样的
    !ruby/object:ActionController::Parameters%'
    在WHERE子句中进行筛选,以仅处理断开的行

    我还强烈建议您在那里时停止使用
    serialize
    serialize
    有点混乱,在数据库中使用YAML没有明智的方法;现在,PostgreSQL和MySQL都支持原生JSON(但我不确定ActiveRecord对MySQL的JSON的支持程度)。

    发生了什么,为什么
    ActionController::Parameters
    (这是
    params
    在控制器中使用的)用于从
    hashWithInferenceAccess继承的
    Hash
    。所以,
    ActionController::Parameters
    过去是真的,就像:

    params.require(:x).permit(some_hash: %i[key1 key2]).is_a? Hash
    
    如果要从
    参数中挖掘
    散列

    some_hash = params.require(:x).permit(some_hash: ...)
    
    并在模型中序列化:

    class M < ApplicationRecord # Or ActiveRecord::Base in the past
      serialize :h, Hash
    end
    #...
    m.h = some_hash
    
    而不是预期的普通哈希

    但后来Rails5出现了:

    • 使
      ActionController::Parameters
      不再继承自
      hashWithInferenceAccess
    ActionController::Parameters
    上调用
    to_h
    to_hash
    会引发异常

    如果升级代码并尝试加载包含序列化数据的模型:

    serialize :h, Hash
    
    然后,模型将从
    h
    加载文本,解析YAML以获得
    ActionController::Parameters
    实例,并调用
    以确保它有一个散列,然后您将得到一个异常

    怎么办 您需要做几件事:

  • 修复控制器,确保它们从
    params
    中得到真正的哈希值
  • 修复数据,以便序列化哈希,而不是
    ActionController::Parameters
    实例
  • 修复控制器很简单,只需调用
    对尚未成为真正散列的参数执行\u unsafe\u h

    修复数据更难看。我可能会使用低级数据库接口(即任何地方都没有ActiveRecord)浏览这些表,从每一行读取YAML,
    YAML.load
    it,通过调用
    to\u unsafe\u h
    将其转换为散列,然后将
    实散列写回\u YAML
    文本。您可以使用像'--'这样的
    !ruby/object:ActionController::Parameters%'
    在WHERE子句中进行筛选,以仅处理断开的行


    我还强烈建议您在那里时停止使用
    serialize
    serialize
    有点混乱,在数据库中使用YAML没有明智的方法;现在,PostgreSQL和MySQL都支持原生JSON(但我不确定ActiveRecord对MySQL JSON的支持程度)。

    数据库中的
    gateway\u response
    是什么?序列化的
    params
    也许?我之所以问这个问题,是因为
    ActionController::Parameters
    用于从
    Hash
    继承,所以您可以
    序列化:stuff,Hash
    ,将
    params
    放入
    stuff
    ,然后,最后在数据库中出现一个标记为
    ActionController::Parameters
    实例的YAML blob。但是
    ActionController::Parameters
    不再从
    Hash
    继承,其
    to_h
    方法引发异常。结果是,如果您没有非常小心,更改Rails版本可能会使数据库中充斥着损坏的数据。@muistooshort就是这样。我并不是所有的购买都有网关响应,因为购买可以以不同的方式进行。一些网关响应来自Authorize.net(旧的),一些来自Stripe,一些来自Paypal。基础