2017-02-21 9 views
2

Я реализовал Объекты Algolia в моем приложении Rails. Я использую его для отображения списка продуктов в качестве результатов поиска.Использование атрибутов индекса algolia в link_to в Rails app

На каждом продукте есть кнопка сохранения. Я хотел бы получить идентификатор каждого результата, чтобы передать его в теге link_to.

Для реализации в режиме реального времени я следил за Algolia's guide.

Я создал индекс под названием Products (на моей учетной записи Algolia). Он имеет заголовок и идентификатор (+ идентификатор объекта, заданный Algolia).

Мои application.js файл с помощью поисковых виджетов Algoli:

var search = instantsearch({ 
    // Replace with your own values 
    appId: "1JJ5DY0CLA", 
    apiKey: 'e24882443747d61c496efc4e17288a36', // search only API key, no ADMIN key 
    indexName: 'Idea', 
    urlSync: true 
}); 


search.addWidget(
    instantsearch.widgets.searchBox({ 
    container: '#search-input', 
    placeholder: 'Search for growth ideas', 
    poweredBy: true 
    }) 
); 

search.addWidget(
    instantsearch.widgets.hits({ 
    container: '#hits', 
    hitsPerPage: 10, 
    templates: { 
     item: getTemplate('hit'), 
     empty: getTemplate('no-results') 
    } 
    }) 
); 


search.start(); 

function getTemplate(templateName) { 
    return document.querySelector('#' + templateName + '-template').innerHTML; 
} 

Код внутри моей index.html.erb зрения выглядит следующим образом:

<div id="hits"></div> 

# Comment: this is the code to structure each result sent by the API 
<script type="text/html" id="hit-template"> 
    <div class="product"> 
     <div class="product-title"> 
      <h3>{{title}}</h3> 
     </div> 
     <div class="product-save"> 
     # Comment: where I'd like to replace product_id by the result id 
      <%= link_to "save", product_path(product_id, current_user), method: :post %> 
     </div> 
    </div> 

Как может Я получаю идентификатор результата, чтобы передать его тегу link_to?

Вот результат, отправленный Algolia (получен из браузера), не знаю, как получить переменную результата внутри представления/контроллера.

{ 
     "results": 
    [ 
     { 
     "hits": 
     [ 
     { 
      "title":"Product title1", 
      "id":65, 
      "objectID":"344300262" 
     }, 
     { 
      "title":"Product title2", 
      "id":66, 
      "objectID":"344300263" 
     } 
     ] 
    } 
    ] 

Первые испытания:

Из algolia примера (смотри выше в моем коде) я undesrtand, что я могу получить результат свойства в HTML, как это: {{id}}. Но я не уверен, что это за «объект».

Я могу отобразить идентификатор на странице с <%= "{{id}}" %>. Но в Ruby, это интерпретируется как строка {{id}} поэтому я не могу использовать его вместе, как показано ниже:

<%= link_to "save", product_path("{{id}}", current_user), method: :post %> 

Кроме того, я увидел, что есть get_object метод, который я могу использовать на индексе, чтобы получить весь объект Algolia в например: index.get_object("objectID"), objectID является integer.

Но что касается идентификатора, я не знаю, как получить идентификатор объекта текущего отображаемого результата.

Если какое-либо улучшение для моего вопроса необходимо, я был бы рад сделать его более понятным. Просто скажи мне.

+0

Вы можете показать мне переменную результата после получения результата поиска в Algolia – Dias

+0

Я добавил контент application.js, и ответ, отправленный Algolia (полученным из браузера), является вкладкой в ​​сети. Но я не уверен, как я не могу получить его из представления, например. @Dias – Didoudida

ответ

0

Вы не можете использовать динамические помощники в своем JavaScript-коде. Причина в том, что link_to вызывается только один раз, при времени рендеринга сервера. Когда страница будет отправлена, ваша ссылка уже была преобразована в тег <a>.

Когда вы используете instantsearch.js, вы снова не вызываете сервер, страница обновляется с использованием только JavaScript, а это означает, что вы не сможете использовать link_to для каждого рендеринга.

Тем не менее, вы действительно были на хорошей дорожке с "{{id}}". Единственная проблема здесь в том, что помощники _path избегают параметров, что имеет смысл, если вы используете пользовательские данные для генерации своего пути, но в этом случае не требуется.

Вы можете, следовательно, сгенерированного экранирования в пути, например, так:

<%= link_to "save", CGI::unescape(product_path("{{id}}", current_user)), method: :post %> 

или

<%= link_to "save", CGI::unescape(product_path("{{objectID}}", current_user)), method: :post %> 

Однако, я не гарантирую, что метод POST будет работать, вы, возможно, придется перепривязывают тех <a> теги, которые мне неизвестны.

+0

Спасибо @ Джерска. Это работает, и поэтому это метод POST. – Didoudida