0

我正在尝试找到一种为我的 Rails 4 应用程序实现竖起大拇指功能的好方法。用户可以在一个页面上看到多个项目,他们可以对每个项目点赞或点赞。我希望他们能够在不重新加载页面的情况下选择拇指向上或向下,同时仍将此信息存储在数据库中。然后,当用户重新访问此页面并找到他们已经投票的项目时,他们的投票应该默认为他们之前所说的。

我已经查看了Thumbs Up gem,但这并不是我想要的。有没有更简单或更有效的方法来做到这一点?

4

2 回答 2

2

您可以尝试使用 ActiveRecord 信誉系统(railscasts 上有一个关于它的插曲:http ://railscasts.com/episodes/364-active-record-reputation-system ,这是一个很好的开始方式)。您仍然必须实现身份验证机制并使用一些 AJAX 来实现投票赞成/反对系统。

我认为没有一种解决方案可以满足您的所有要求(如果 ThumbsUp 不适合,那么您可能有一些非常具体的要求)。

更新

ThumbsUp 中的投票确实是通过控制器进行的,您仍然可以使用 AJAX 请求异步执行它 - 在这种情况下,页面不会重新加载。

于 2013-07-01T13:43:10.427 回答
0

我为表情符号实现了以下方式,您只需将其更改为竖起大拇指表情符号:

创建投票迁移

class CreateVotes < ActiveRecord::Migration[6.1]
  def change
    create_table :votes do |t|
      t.boolean :like, default: false
      t.boolean :celebration, default: false
      t.references :user, null: false, foreign_key: true
      t.integer :voteable_id
      t.string  :voteable_type
      t.timestamps
    end
    add_index :votes, %i[user_id voteable_id], unique: true
  end
end

投票模式:

class Vote < ApplicationRecord
  belongs_to :user
  belongs_to :voteable, polymorphic: true
  validates :user_id, uniqueness: { scope: %i[voteable_id voteable_type] }
end

可投票关注的模型:

module Voteable
  extend ActiveSupport::Concern

  included do
    has_many :votes, as: :voteable, dependent: :destroy
  end

  def total(icon)
    icon_votes ||= Vote.where("#{icon}": true, voteable_id: id, voteable_type: self.class.name).count
    icon_votes
  end
end

然后在路线中将以下内容添加到您想要投票的类中:

resources :some_voteable_type do
  member do
    put :vote
  end
  ...
end

在 some_voteable_type 模型中:

class some_voteable_type < ApplicationRecord
  include Voteable
  # more model code
end

在 some_voteable_type 控制器中:

#if you have like dislike you have to add dislike method and dislike route and adjust the logic accordingly
def vote
      emoji_symbol = params[:emoji]
      vote = Vote.find_or_create_by(voteable_id: @session.id, voteable_type: 'Session', user: current_user)
      vote.send(emoji_symbol) ? vote.update(emoji_symbol.to_sym => false) : vote.update(emoji_symbol.to_sym => true)
    end

现在_votes.html.slim在 some_voteable_type 视图中定义。当你在一页上有几个时,id #show-session-votes 可能需要调整。

  = link_to vote_backend_session_path(@session.id, emoji: :flash_on), method: :put, remote: true, class: "btn #{@session.active :flash_on} btn-vote btn-xs bg-dark body-text border-white hover-primary" do
    i.material-icons-outlined.d-inline.align-middle.me-lg-2 flash_on
    span.align-middle.text-white.ms-2 = @session.total(:flash_on)

= render 'votes'在您的显示视图中执行。

然后在vote.js.erb这里添加:

$("#show-session-votes").html("<%= escape_javascript(render 'votes') %>");

当您想对不同页面重复使用投票时,您必须改为将其设为嵌套路由。

于 2021-11-01T12:27:28.817 回答