Параметр списка в диалоговом окне для помощника Google не дает правильных результатов

Вы можете использовать дополнительную скобку:

subkeyword = (
        Session.query(Subkeyword.subkeyword_id, Subkeyword.subkeyword_word)
        .filter_by(subkeyword_company_id=self.e_company_id)
        .filter_by(subkeyword_word=subkeyword_word)
        .filter_by(subkeyword_active=True)
        .one()
    )
0
задан Prisoner 18 January 2019 в 12:12
поделиться

1 ответ

У вас есть несколько вопросов здесь, поэтому трудно точно сказать, какая из них является реальной проблемой, но все они сводятся к следующему утверждению в вашем вопросе:

[1115 ] Пожалуйста, не спрашивайте меня, почему я использовал определенный кусок кода

Мы понимаем, что вы новичок - мы все были там! Но копирование кода без понимания того, что он должен делать, - рискованный путь.

Тем не менее, в вашем дизайне и коде есть несколько моментов, которые вызывают у меня проблемы:

Микширование библиотек

Вы, кажется, загружаете оба библиотека Actions-on-Google и библиотека выполнения диалогового потока. Хотя большая часть того, что вы делаете, связана с библиотекой actions-on-google, intentMap - это то, что используется библиотекой d-f.

Вы не можете смешать два. Выберите один и поймите, как регистрировать обработчики и как эти обработчики выбираются.

Зарегистрируйте обработчики в Actions-on-Google

Если вы используете библиотеку aog, вы обычно создаете объект app с чем-то вроде

[110 ]

, а затем зарегистрировать каждый обработчик с помощью чего-то вроде

app.intent( 'intent name', conv => {
  // handler code here
});

Вы зарегистрируете приложение для обработки запроса и ответа с помощью чего-то вроде

exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);

Зарегистрируйте обработчик с диалоговым потоком выполнения

Подход диалога выполнения аналогичен, но он предлагает создать Map, который отображает имя намерения на функцию обработчика. Примерно так:

let intentMap = new Map();
intentMap.set( 'intent name', handlerFunction );

Где handlerFunction - это также имя функции, которую вы хотите использовать в качестве обработчика. Это может выглядеть примерно так

function handlerFunction( agent ){
  // Handler stuff here
}

Затем вы можете создать агент, установить объекты запроса и ответа, которые он должен использовать, и указать ему использовать карту, чтобы выяснить, какой обработчик намерений вызывать с чем-то вроде [ 1128]

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
  const agent = new WebhookClient({ request, response });
  agent.handleRequest( intentMap );

Intents представляют то, что делает пользователь , а не то, что вы делаете с ним

Помните, что Intents представляют действие пользователя.

То, что вы делаете на основе этого действия, зависит от многих вещей. В вашем случае, после того, как они выбрали опцию, вы хотите ответить так же, как если бы они вызвали ее с определенным намерением. Правильно?

Вы не делаете это, пытаясь вызвать это намерение.

То, что вы делаете, это то, что у вас есть оба обработчика, вызывающие функцию, которая делает то, что вы хотите. В этом нет ничего особенного - оба просто вызывают одну и ту же функцию, как и многие другие программы, которые могут вызывать общие функции.

Не пытайтесь динамически регистрировать обработчики

В связи с предыдущей проблемой, попытка зарегистрировать новый обработчик внутри существующего обработчика не будет делать то, что вы хотите. К тому времени уже слишком поздно, и обработчики уже вызваны.

Могут быть ситуации, когда это имеет смысл - но их очень мало, далеко друг от друга, и очень очень продвинутая концепция. В общем, зарегистрируйте все ваши обработчики в центральном месте, как я обрисовал выше.

0
ответ дан Prisoner 18 January 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: