У меня есть ситуация с отношением HABTM, когда я должен передать экземпляры моделей shop
и event
в ShopEventsController
, чтобы назначить событие магазину.
Маршруты настроены следующим образом:
resources :shops, except: [:create, :destroy] do
resources :events, controller: 'shop_events', only: [:index, :create, :destroy]
Что дает нам следующие конечные точки:
/shops/:shop_id/events
/shops/:shop_id/events/id
ShopEventsController
имеет strong_params, определенные следующим образом:
def shop_event_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(params,
only: [
:shop,
:event
])
end
Я не могу понять, как передать действительные параметры из спецификации запроса RSpec ...
Короче, думаю, мне нужно:
ActiveModelSerializers::SerializableResource.new(event).to_json
и ActiveModelSerializers::SerializableResource.new(shop).to_json
для перехода на запрос:
let(:event) { create(:unpublished_event, country: country, language: language) }
let(:valid_params) do
{
shop: ActiveModelSerializers::SerializableResource.new(shop),
event: ActiveModelSerializers::SerializableResource.new(event)
}.to_json
end
expect {
post "/shops/#{shop.id}/events", params: valid_params, headers: headers
}.to change(shop.events, :count).by(1)
но это не с:
ActiveModelSerializers::Adapter::JsonApi::Deserialization::InvalidDocument:
Invalid payload ({:data=>"Expected hash"}): ...
Если я изменю valid_params
, добавив to_json
на каждую модель:
let(:valid_params) do
{
shop: ActiveModelSerializers::SerializableResource.new(shop).to_json,
event: ActiveModelSerializers::SerializableResource.new(event).to_json
}
end
он также не работает и завершается с ошибкой синтаксического анализа:
ActionDispatch::Http::Parameters::ParseError:
765: unexpected token at 'shop=%7B%22data%22%3A%7B%2....
Вот что выкладывается при создании:
Parameters: {"data"=>{"relationships"=>{"shop"=>{"data"=>{"type"=>"shops", "id"=>"613"}}, "event"=>{"data"=>{"type"=>"events", "id"=>"46"}}}, "type"=>"shop-events"}, "shop_id"=>"613"}
В параметре ShopEventsController
strong_params определено следующее:
def shop_event_params
ActiveModelSerializers::Deserialization.jsonapi_parse!(params,
only: [
:shop,
:event
])
end
и shop_event_params
возвращает только 2 идентификатора:
shop_event_params: {:shop_id=>"613", :event_id=>"46"}
Что с этим не так? Спасибо.