【问题标题】:Devise Ahoy track link visits设计 Ahoy 跟踪链接访问
【发布时间】:2019-06-09 00:56:24
【问题描述】:

您好,我有一个 Rails 应用程序,它是一个使用设计、ahoy 和优点的封闭社区。

我们有一个叫做资源的脚手架。每个资源都有一个链接

用户模型

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 来跟踪点击链接的用户,以便我可以为访问奖励积分。

查看

<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

我将如何跟踪链接点击并分配积分?

【问题讨论】:

    标签: ruby-on-rails ahoy merit-gem


    【解决方案1】:

    让我们在点击链接时向visits_controller 发出请求。 配置/路由.rb 资源:访问

    controllers/visits.rb

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

    我假设 ahoy.authenticate(user) 写在某处 让我们将类资源添加到链接和链接id作为数据属性,这样我们就可以绑定一个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')}
             })
        })
    })
    

    【讨论】:

    • 嗨@DileepNandanam 有几件事,我使用的是rails 6,所以JS需要打包,另一件事是链接不是单独的模型,它是资源表中的一列...我将更新问题以显示架构
    • 嗨 Dileep,是的,但我很困惑,因为链接不是模型,它是列...检查架构...。我可能遗漏了一些东西...但是我该如何使用列上的 link_id
    • 表示你使用resource.id作为link_id的链接
    • 啊,是的,你太棒了,你能更新一下 js,这样我就可以标记你的答案是正确的
    • 我将 tracker.js 添加到 /app/javascript/packs/tracker.js 并在 app/javascript/packs/application.js 中调用 import './tracker'。
    【解决方案2】:

    我没有使用 ahoy,所以也许我的帮助可能没有用。

    我不是 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' %>
    

    如果您找到另一个解决方案,请在下面发布您的解决方案!

    【讨论】:

    • 嗨@Armand,我需要做一个连接表点击用户:参考资源:参考因为点击需要属于每个用户?
    • 是的,您可能需要一个连接表。你检查过stackoverflow.com/a/56511343/7359370 吗?这是实现目标的最简单方法。
    猜你喜欢
    • 2015-10-23
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 2012-06-27
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多