Rails: "частный метод` require 'вызван для # <Hash ... "при создании записи вручную (не через форму)

У меня есть текстовый файл с данными, которые мне нужно сохранить в базе данных.

В действии контроллера Rails у меня есть что-то вроде этого:

class ImportDataController < ApplicationController
  protect_from_forgery except: :abc_client

  def abc_client
    ...simplified code:...
    ...loading data from a file...
    car = {}
    car[:attr1] = something
    car[:attr2] = something
    car[:attr3] = something
    ...and so on...

    ...now I try to save the record to the DB...
    @car = Cars::Crud::CreateService.new(car).create
  end
end

И я получаю такую ​​ошибку:

private method `require' called for #<Hash:0x007fb2e2ef6040>

и точки ошибок в этом блоке кода:

def car_params(params)
  params.require(:car).permit(:attr1, :attr2, ...)

Я попытался также создать запись «нормально» через форму Rails, скопировал хэш с консоли и попытался сохранить его, например:

params = {"utf8"=>"✓", "authenticity_token"=>"kXMd23s4msX2OzhUAX2CWqyphnpCPNorQOvoitatj8uBsQBgGYbTgfoR1wTTWlufo++esyb5m9ogBfSHbCrAPA= = ", "car"=>{"attr1"=>"6", ...

@car = Cars::Crud::CreateService.new(params).create

Но это привело к тому же сообщению об ошибке.

Как мне это понять?

Спасибо

🤔 А знаете ли вы, что...
Rails включает в себя генераторы кода, которые позволяют быстро создавать структуру приложения и его компоненты.


2
1 420
1

Ответ:

Трудно ответить, не зная, где определяется car_params, но я могу с уверенностью сказать вам, что проблема в том, что params, который вы ему передаете, является обычным Ruby Hash, а не Rails ActionController::Parameters, где определяется #require.

Вы можете либо не использовать строгие параметры, а заменить их на fetch и slice, например так:

params.fetch(:car).slice(:attr1, :attr2, ...) 

Или, если вы действительно хотите использовать строгие параметры, вы можете обернуть свой хеш следующим образом:

ActionController::Parameters.new(some_ruby_hash)

И тогда вы можете вызвать на нем #require и #permit.