Rails: "закрытый метод" require "вызывается для # - PullRequest
0 голосов
/ 25 апреля 2018

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

В действии контроллера 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

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

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

Спасибо

1 Ответ

0 голосов
/ 25 апреля 2018

Трудно ответить, не зная, где определено 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 на него.

...