#ruby-on-rails #controller #associations #has-many
Вопрос:
У меня есть 3 модели со многими отношениями к одному (FK)
class A < ApplicationRecord
#fields: ssn
has_many :persons
accepts_nested_attributes_for :persons
end
class Alias < ApplicationRecord
#fields :name,
belongs_to :person, optional: true
end
class Person < ApplicationRecord
#fields, :unique_name
belongs_to :a
has_many :aliases
accepts_nested_attributes_for :aliases
end
контроллер///
Создать:
Сообщение /a(ы)
#a
def a_params
params.permit(:id, :ssn, persons_attributes: [:id, :unique_name, :aliases_attributes: [:id, :name])
end
#
запись псевдонима :создание псевдонимов/
def alias_params
params.permit(:id, :name)
end
//Человек
#СООБЩЕНИЕ a/a_id/лица
def create
@a = A.find(params(:a_id))
@p = @a.persons.create()
render json: @p, status: :created
end
def person_params
params.require(:person).permit(:id, :unique_name, :aliases_attributes => [:id, :name])
end
Однако, когда я пытаюсь создать модель человека
, она возвращает пустой массив для псевдонимов
, в этом случае псевдонимы создаются таким образом, что, например, с запросом post на example.com/a(ы)/1/человек
{"person": {
unique_name: "rails behave like a fool",
aliases: [{
"id": 2,
"name": "Django is better",
},
{
"id": 3,
"name": "Django is still better",
}]
]
}
Возвращает, скажем, с использованием псевдо-идентификатора
Лицо #объект
{«идентификатор»: 1, «уникальное имя»: «рельсы ведут себя как дурак», «псевдонимы»: []}
вместо {«идентификатор»: 1, «уникальное имя»: «рельсы ведут себя как дураки», «псевдонимы»: [{«идентификатор»: 2, имя: «Джанго лучше»}, {«идентификатор»: 3, имя: «Джанго все еще лучше»}]}
#журналы из реального проекта
> Started POST "/api/v1/tickets/1/tasks" for ::1 at 2021-09-03 11:29:50
> 0100 Processing by Api::V1::TasksController#create as JSON
Parameters: {"task"=>{"tracker"=>"1234880", "description"=>"house
> mates oyghjnyguh", "rating"=>2, "services"=>[{"id"=>4,
> "name"=>"UaS7yBwV", "cost"=>"1753.0"}, {"id"=>5, "name"=>"BmBn7UyY",
> "cost"=>"1668.0"}, {"id"=>6, "name"=>"VgSpVgRp", "cost"=>"1209.0"},
> {"id"=>7, "name"=>"Sj0L4aJt", "cost"=>"1587.0"}, {"id"=>8,
> "name"=>"281BfHx4", "cost"=>"793.0"}, {"id"=>9, "name"=>"2PbGb6Xh",
> "cost"=>"1433.0"}, {"id"=>10, "name"=>"GvH3sSx0", "cost"=>"1874.0"},
> {"id"=>11, "name"=>"OoPkRzMy", "cost"=>"1497.0"}, {"id"=>12,
> "name"=>"MjUhDjFd", "cost"=>"843.0"}]}, "ticket_id"=>"1"}
> [1m[36mTicket Load (0.9ms)[0m [1m[34mSELECT "tickets".* FROM
> "tickets" WHERE "tickets"."id" = $1 LIMIT $2[0m [["id", 1],
> ["LIMIT", 1]] ↳ app/controllers/api/v1/tasks_controller.rb:54:in
> `set_current_ticket' [31mUnpermitted parameter: :services[0m
> [31mUnpermitted parameter: :services[0m [1m[35m (69.1ms)[0m
> [1m[35mBEGIN[0m ↳ (byebug):1:in `create' [1m[36mService
> Exists? (140.3ms)[0m [1m[34mSELECT 1 AS one FROM "services" WHERE
> "services"."name" IS NULL LIMIT $1[0m [["LIMIT", 1]] ↳
> (byebug):1:in `create' [1m[35m (0.9ms)[0m [1m[31mROLLBACK[0m
> ↳ (byebug):1:in `create' [1m[35m (0.8ms)[0m [1m[35mBEGIN[0m
> ↳ app/controllers/api/v1/tasks_controller.rb:17:in `create'
> [1m[36mService Exists? (1.7ms)[0m [1m[34mSELECT 1 AS one FROM
> "services" WHERE "services"."name" IS NULL LIMIT $1[0m [["LIMIT",
> 1]] ↳ app/controllers/api/v1/tasks_controller.rb:17:in `create'
> [1m[35m (0.9ms)[0m [1m[31mROLLBACK[0m ↳
> app/controllers/api/v1/tasks_controller.rb:17:in `create'
> [1m[36mUser Load (1.4ms)[0m [1m[34mSELECT "users".* FROM "users"
> WHERE "users"."id" = $1 LIMIT $2[0m [["id", 1], ["LIMIT", 1]] ↳
> app/controllers/application_controller.rb:56:in `current_user'
> [active_model_serializers] Rendered ActiveModel::Serializer::Null with
> ActiveModel::Errors (0.75ms) Completed 400 Bad Request in 1047415ms
> (Views: 769.7ms | ActiveRecord: 220.6ms | Allocations: 489006)
Я намерен, чтобы псевдоним, который используется для обслуживания в реальном проекте, был автономным
Комментарии:
1. Пожалуйста, опубликуйте журнал, когда вы пытаетесь создать человека, и ответ.
2. журнал возвращает массив как пустой, скажем, для человека {» идентификатор»: 1, «уникальное имя»: «рельсы ведут себя как дурак», псевдонимы: [] }
3. Нет, для журнала я имею в виду все выходные данные, когда вы отправляете полезную нагрузку на контроллер, тот, что в
log/development.log
файле4. хорошо, пример, который я использовал выше, — это псевдомодель, не совсем та модель, которая есть у меня в моем реальном проекте, поэтому я дал им такие имена, как A, Псевдоним и Человек. но отношения в контексте те же, что и с моей реальной моделью
5. Но я чувствую, что то, что я опубликовал выше, по-прежнему понятно само по себе, обычно он возвращает 201 созданный, за исключением того, что он делает это с пустым массивом для псевдонимов