我正在尝试找到一种为我的 Rails 4 应用程序实现竖起大拇指功能的好方法。用户可以在一个页面上看到多个项目,他们可以对每个项目点赞或点赞。我希望他们能够在不重新加载页面的情况下选择拇指向上或向下,同时仍将此信息存储在数据库中。然后,当用户重新访问此页面并找到他们已经投票的项目时,他们的投票应该默认为他们之前所说的。
我已经查看了Thumbs Up gem,但这并不是我想要的。有没有更简单或更有效的方法来做到这一点?
我正在尝试找到一种为我的 Rails 4 应用程序实现竖起大拇指功能的好方法。用户可以在一个页面上看到多个项目,他们可以对每个项目点赞或点赞。我希望他们能够在不重新加载页面的情况下选择拇指向上或向下,同时仍将此信息存储在数据库中。然后,当用户重新访问此页面并找到他们已经投票的项目时,他们的投票应该默认为他们之前所说的。
我已经查看了Thumbs Up gem,但这并不是我想要的。有没有更简单或更有效的方法来做到这一点?
您可以尝试使用 ActiveRecord 信誉系统(railscasts 上有一个关于它的插曲:http ://railscasts.com/episodes/364-active-record-reputation-system ,这是一个很好的开始方式)。您仍然必须实现身份验证机制并使用一些 AJAX 来实现投票赞成/反对系统。
我认为没有一种解决方案可以满足您的所有要求(如果 ThumbsUp 不适合,那么您可能有一些非常具体的要求)。
更新
ThumbsUp 中的投票确实是通过控制器进行的,您仍然可以使用 AJAX 请求异步执行它 - 在这种情况下,页面不会重新加载。
我为表情符号实现了以下方式,您只需将其更改为竖起大拇指表情符号:
创建投票迁移
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') %>");
当您想对不同页面重复使用投票时,您必须改为将其设为嵌套路由。