获取当前用户ID并存储它

时间:2013-12-04 07:12:12

标签: mysql ruby-on-rails backbone.js

我目前正在尝试在我的webapp上制作一个Up Vote / Down Vote系统(根据我的评论,与StackOverflow非常相似)。我目前可以添加和减去投票,但我没有进行验证来限制每位用户的上下投票数量。

此外,我认为我的问题的关键是获取当前用户ID。我的前端是在主干上构建的,后端是在轨道上。在rails和erb中,我可以使用current_user来获取current_user id(我认为current_user来自设计)。问题是我的投票系统仍然没有存储投票的用户ID。

我想我必须在我的数据表中添加一个“upvote_id”列。这是我目前的表格。

create_table "comments", force: true do |t|
    t.integer  "user_id" **the user that created the comment
    t.integer  "question_id"
    t.text     "comment"
    t.integer  "upvotes"
    t.datetime "created_at"
    t.datetime "updated_at"

在骨干网中,这是我的upvote / downvote函数和事件。** addUpVote,** removeUpVote

app.CommentView = Backbone.View.extend({

  tagName: 'div',

  template: _.template( $('#comment-template').html() ),

  // "<event> <selector>" : "<method>" aka function defined below
  events: {
    // 'keypress #new-comment': 'createNewCommentOnEnter',
    'click #up' : 'addUpVote',
    'click #down' :'subtractVote',
    // 'click #comment-field' : 'toggleCommentField'
    'click .destroy_comment' : 'removeOneComment'

  },

  initialize: function() {
    // this.listenTo(this.model, 'add', this.addOneComment);
    this.listenTo(this.model,'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
  },

  render: function() {
    this.$el.html( this.template( this.model.toJSON() ) );
    // this.$el.attr('comment_id', this.model.get('id'));
    this.$input = this.$('#new-comment');
    this.$upvote = this.$('#upvote');
    return this;
  },

removeOneComment: function() {
    this.model.destroy();
  },

  addUpVote: function() {
    console.log(this.model);
    var upVoteCount = this.model.get('upvotes');
    var newUpVoteCount = upVoteCount + 1;
    console.log(newUpVoteCount);
      this.model.save({upvotes: newUpVoteCount});
  },

  subtractVote: function() {
    var downVoteCount = this.model.get('upvotes');
    var newDownVoteCount = downVoteCount - 1;
      this.model.save({upvotes: newDownVoteCount});
  }

我能想到解决问题的一种方法是能够在点击投票或投票时获得当前用户ID。然后,获取选民的user_id并将其存储在我的注释表中名为upVotersId的新列中。然后使用该ID,我可以开始创建验证。

这是一种合理的方法吗?我不清楚如何获取当前用户ID,也许我可以从点击事件中获取它?我想收集任何点击upvote箭头或downvote箭头的user_id来限制他们点击的次数(如果他们的id在upVotersId字段中,他们就不能再投票了。)

有没有人对如何收集/获取upvoters用户ID有任何想法?

很抱歉,如果我没有发布足够的信息来解决问题。我也会添加我的用户表。谢谢你的帮助!

create_table "users", force: true do |t|
    t.string   "email",                              default: "", null: false
    t.string   "encrypted_password",                 default: "", null: false
    t.integer  "question_id",            limit: 255
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",                      default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "provider"
    t.string   "uid"
    t.string   "name"
  end

1 个答案:

答案 0 :(得分:1)

我认为适合您的问题的设计是:

  1. 创建一个将在登录时实例化的User Backbone.Model
  2. User模型应该可以从您CommentView
  3. 访问
  4. Comment模型而不是upvote / downvote中有一个来自User-&gt; Vote的VotingDictionary(简单json)对象,例如: { 12333326 : +1, 23132234 : -1 }
  5. Comment模型中有2个函数,model.upvote(id)和model.downvote(id)操作此VotingDictionary
  6. 当用户点击upVote按钮时,您应该在视图this.model.upvote(user.get("userID"))
  7. 中调用
  8. “评论”视图计算投票得分,并使用视图
  9. 更新html
  10. 评论保存在服务器上(通过rest api)如果出现故障,应该使用适当的用户通知回滚
  11. 注意:如果您在HTML页面中有多个带有此ID的元素(许多注释),则不应使用html元素ID(<div id='upvote'>