Я работаю над проектом базы данных Catalyst и пытаюсь выполнить некоторые запросы AJAX через jQuery. Параметры посылаются ОК, как можно видеть в изображении 1.Итерация через массив Perl из запроса AJAX
Обратите внимание, что как «диагностика» и «type_consents» (и соответствующие им даты) посылаются в виде массива значений (значение 1, значение 2, ... значение n).
Теперь для обработки на стороне сервера Catalyst::Request
позволяет легко извлекать данные через $req->parameters
, но, похоже, он не работает для меня.
Я делаю это так:
my $params = $c->request->parameters; #Retrieving all parameters
my @type_consents = $params->{type_consent};
my @date_consents = $params->{date_consent};
my @diagnosis = $params->{diagnosis};
my @date_diagnosis = $params->{date_diagnosis};
Тогда мне нужно цикл этих массивов и сделать вставку для каждой пары значений (diagnosis|date , consent|date)
. Кроме того, мне нужно хранить и обрабатывать все операции и выполнить их все сразу в eval()
блоке, поэтому я делаю это так:
my %transactions;
# Diagnosis
my $diag_index = 0;
foreach my $key (0 .. $#diagnosis) {
$transactions{diagnosis}{$diag_index} = $diagnosis_mod->new(
{
subject_id => $subject_id,
diagnosis_date => $date_diagnosis[$key],
diagnosis => $diagnosis[$key],
diagnosis_comment => "",
suggested_treatment => ""
}
);
print STDERR "\n" . $date_diagnosis[$diag_index];
print STDERR "\n DEBUG: $date_diagnosis[$diag_index] | $diagnosis[$diag_index] | key: $diag_index";
print STDERR "\n DEBUG2:" . Dumper(@date_diagnosis) . " | " . Dumper(@diagnosis);
$diag_index++;
}
# I'm avoiding evaluating and performing the transactions so neither eval() nor database impact are shown above.
Эти напечатает отладка следующее:
Означает ли это, что мой «массив» - это просто одномерная переменная со строкой? Я попытался разбить его, но это тоже не сработает.
Ну оба сделали довольно хорошо. Большое спасибо, @ Танкалус. Я лично думаю, что второй вариант немного легче читать, поэтому я собираюсь с ним, но оба работали :) –
Я проводил некоторое тестирование, и кажется, что это работает нормально ТОЛЬКО при отправке 2 или более элементов. Я получаю эту ошибку каждый раз, когда отправляется 1 элемент (минимально приемлемый для запроса): '[ошибка] Исправлено исключение в pbitdb :: Controller :: Subjects-> add" Нельзя использовать строку ("1") в качестве ARRAY ref в то время как «строгие ссылки» используются в /home/lioneluranl/svn/pbitdb/pbitdb/script/../lib/pbitdb/Controller/Subjects.pm строке 119. «' ... где в этом случае " 1 "- это значение, отправленное ... и строка, на которую ссылается, является той, где я объявляю список: ' my @type_consents = @ {$ params -> {type_consent}}; ' Любые идеи? –
IMO, это плохой дизайн для динамических типов - ключ, который может иметь скалярное значение * или * значение массива (ссылки).Однако, если API, который вы вызываете, не находится под вашим контролем, вам, возможно, придется иметь дело с ним в вашем коде: 'my @type_consent = ref $ params -> {type_consent}? @ {$ params -> {type_consent}}: $ params -> {type_consent}; 'Аналогично для ссылки:' my $ tc = ref $ params -> {type_consent}? $ params -> {type_consent}: [$ params -> {type_consent}] ' – Tanktalus