2017-02-21 101 views
2

我在我的Rails應用中實現了Algolia的即時搜索。我用它來顯示產品列表作爲搜索結果。在Rails應用中使用link_to中的algolia索引屬性

在每個產品上都有一個保存按鈕。我想要檢索每個結果的ID,並將其傳遞給link_to標記。

對於即時搜索實施,我跟着Algolia's guide

我創建了一個名爲Products(在我的Algolia帳戶上)的索引。它有一個標題和一個id(+ Algolia提供的objectID)。

我的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> 

哪有我檢索結果的id傳遞給link_to標記?

這是Algolia發出的結果(從瀏覽器中獲得),不知道如何在視圖/控制器中獲取結果變量。

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

第一次測試:

從algolia例子(見上面我的代碼)我undesrtand,我可以檢索結果屬性到像這樣的HTML:{{id}}。但我不確定它是什麼樣的「對象」。

我可以用<%= "{{id}}" %>在頁面上顯示id。但是在Ruby它被解釋爲一個字符串{{id}},所以我不能用它沿着象下面這樣:

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

而且,我看到有一個get_object方法,我可以用我的索引檢索整個Algolia的對象像這樣: index.get_object("objectID")objectIDinteger

但至於id,我不知道如何獲得顯示的當前結果的objectID。

如果需要改進我的問題,我很樂意讓它更容易理解。就告訴我嘛。

+0

你可以告訴我結果變量後,從阿爾戈利亞搜索結果 – Dias

+0

我添加了application.js內容,並且Algolia(從瀏覽器獲得它)發送的響應是網絡選項卡。但我不確定我是如何從視圖中得不到它的。 @Dias – Didoudida

回答

0

您不能在JavaScript代碼中使用動態助手。 原因是在服務器渲染時只調用一次link_to。 當頁面被投放時,您的鏈接已被轉換爲<a>標籤。

當您使用instantsearch.js時,您不會再次調用服務器,頁面僅使用JavaScript進行刷新,這意味着您將無法在每個渲染上使用link_to

但是,你確實是在"{{id}}"的好路上。這裏唯一的問題是_path幫助程序正在轉義參數,如果您使用用戶數據來生成路徑,這是有意義的,但在這種情況下不是必需的。

可以因此UNESCAPE生成的路徑,像這樣:

<%= 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

謝謝@Jerska。這工作,所以那些POST方法。 – Didoudida

相關問題