Rails:手动创建记录时(不通过表单)“调用了私有方法‘require’#<Hash...”

use*_*621 5 ruby ruby-on-rails ruby-on-rails-4

我有一个文本文件,其中包含需要存储在数据库中的数据。

\n\n

在 Rails 控制器操作中,我有这样的内容:

\n\n
class ImportDataController < ApplicationController\n  protect_from_forgery except: :abc_client\n\n  def abc_client\n    ...simplified code:...\n    ...loading data from a file...\n    car = {}\n    car[:attr1] = something\n    car[:attr2] = something\n    car[:attr3] = something\n    ...and so on...\n\n    ...now I try to save the record to the DB...\n    @car = Cars::Crud::CreateService.new(car).create\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

我收到此错误:

\n\n
private method `require\' called for #<Hash:0x007fb2e2ef6040>\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及该代码块上的错误点:

\n\n
def car_params(params)\n  params.require(:car).permit(:attr1, :attr2, ...)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我还尝试通过 Rails 表单“正常”创建一条记录,并从控制台复制哈希值并尝试保存它,例如:

\n\n
params = {"utf8"=>"\xe2\x9c\x93", "authenticity_token"=>"kXMd23s4msX2OzhUAX2CWqyphnpCPNorQOvoitatj8uBsQBgGYbTgfoR1wTTWlufo++esyb5m9ogBfSHbCrAPA==", "car"=>{"attr1"=>"6", ...\n\n@car = Cars::Crud::CreateService.new(params).create\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它导致了相同的错误消息。

\n\n

我该如何弄清楚?

\n\n

谢谢

\n

小智 8

在不知道在哪里定义的情况下很难回答car_params,但我可以肯定地告诉你,问题是params你传递的它是一个普通的 RubyHash而不是 Rails ActionController::Parameters,这是在哪里#require定义的。

您可以不使用强参数,并将其替换为fetchslice,如下所示:

params.fetch(:car).slice(:attr1, :attr2, ...) 
Run Code Online (Sandbox Code Playgroud)

或者,如果您确实想使用强参数,您可以像这样包装您的哈希:

ActionController::Parameters.new(some_ruby_hash)
Run Code Online (Sandbox Code Playgroud)

然后你就可以打电话#require#permit