Devise Ahoy отслеживание посещений - PullRequest
2 голосов
/ 09 июня 2019

Здравствуйте, у меня есть приложение rails, которое является закрытым сообществом, использующим devise, ahoy и merit.

У нас есть эшафот, называемый ресурсами. Каждый ресурс имеет ссылку

Модель пользователя

class User < ApplicationRecord
  has_merit
  has_many :visits, class_name: “Ahoy::Visit”
end

Ресурсы модели

class Resource < ApplicationRecord
  has_rich_text :description
  belongs_to :category
end

Контроллер

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

View

<table>
  <thead>
    <tr>
      <th>Title</th>
      <th>Link</th>
      <th>Category</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @resources.each do |resource| %>
      <tr>
        <td><%= resource.title %></td>
        <td><%= link_to "Learn More", resource.link, class: 'btn btn-dark btn-sm' %></td>
        <td><%= resource.category.name %></td>
        <td><%= link_to 'Show', resource %></td>
        <td><%= link_to 'Edit', edit_resource_path(resource) %></td>
        <td><%= link_to 'Destroy', resource, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

Схема

create_table "resources", force: :cascade do |t|
    t.string "title"
    t.string "link"
    t.bigint "category_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["category_id"], name: "index_resources_on_category_id"
  end

Маршруты

Rails.application.routes.draw do
  resources :visits
  resources :resources
devise_for :users, controllers: { registrations: 'registrations' }
end

Как мне отслеживать клик по ссылке и назначать баллы?

Ответы [ 2 ]

3 голосов
/ 09 июня 2019

позволяет сделать запрос на посещение_контроллера при нажатии на ссылку.Ресурсы config / rout.rb: посещения

контроллеры / посещения.рб

class VisitsController < ApplicationController
    def create
        Ahoy::Visit.track('click', link_id: params[:resource_id])
    end
end

Я предполагаю, что ahoy.authenticate (пользователь) где-то записан. Добавим ресурс класса для ссылки и идентификатором ссылки в качестве данныхattr, чтобы мы могли связать вызов ajax с контроллером посещений, содержащим необходимое представление данных

<td><%= link_to "Learn More", resource.link, class: 'resource btn btn-dark btn-sm' data: {resource_id: resource.id} %></td>

assets / javascripts / tracker.js

(document).on('turbolinks:load', function() { #or whatever you used to do in your app
    $('a.resource').on('click', function() {
         that = this
         $.ajax({
             url: 'visits',
             method: 'POST',
             data: {resource_id: $(that).data('resource_id')}
         })
    })
})
2 голосов
/ 09 июня 2019

Я не пользуюсь Ахой, поэтому, возможно, моя помощь может оказаться бесполезной.

Я не на 100% нужен вам для этого, я думаю, что это может быть достигнуто путем нажатия на поле в модели ресурсов, которое обновляется каждый раз, когда пользователь нажимает на ссылку.

Что я попробую:

в Resource_controller.rb:

def link
  ahoy.track "Link clicked" if params[:clicked]
  @resource = Resource.find(params[:id])
end

в поле зрения:

<%= link_to "Learn More", resource_link_path(link: resource.link, clicked: true) resource.link, class: 'btn btn-dark btn-sm' %>

Опубликуйте свое решение ниже, если вы нашли другое!

...