У меня есть текстовый файл с данными, которые мне нужно сохранить в базе данных.
В действии контроллера 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 включает в себя генераторы кода, которые позволяют быстро создавать структуру приложения и его компоненты.
Трудно ответить, не зная, где определяется 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
.