【问题标题】:Calculating user karma with acts_as_votable用acts_as_votable计算用户业力
【发布时间】:2014-03-31 18:11:53
【问题描述】:

我使用acts_as_votable gem:https://github.com/ryanto/acts_as_votable

共有三种投票模式

  1. 评论
  2. 书籍
  3. 电影

这些模型中的每一个都属于一个用户。

用户业力是他们在所有 cmets、书籍和电影中获得的总票数乘以 2 加上分数调整值。

现在我只用 cmets 试试这个:

<%= "#{((current_user.comments.map{|c| c.votes.count}.inject(:+))*2) + current_user.score_prop}" %>

我收到了这个错误:

undefined method `*' for nil:NilClass

我只是在这个错误之后不断地遇到错误。根据 cmets、书籍和电影计算总分的最佳方法是什么?我应该从我的控制器而不是我的视图中执行此操作吗? (我在视图中有它的原因是因为我在页脚布局中有它。

【问题讨论】:

  • 我猜当当前用户没有 cmets 时这会爆炸?或者 cmets 没有投票 - 无论哪种方式都有一个 nil 并且你正在调用它的注入......这当然行不通。
  • 顺便说一句 - &lt;%= 已经调用了“to_s” - 你不需要将你的计算放在字符串中:"#{}"
  • 我正在使用字符串插值在输出的数字周围添加文本,是的,你的权利!当用户没有投票或cmets时,这件事就发疯了!!! :)
  • 是的 - 在继续计算之前,您需要检查这种情况。看我的回答
  • 公平的 re: string interpolaion - 虽然如果你在 Stack Overflow 问题中去掉那种东西会很有用 - 因为我们没有必要帮你解决你的问题 :)

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:
<%= "#{((current_user.comments.map{|c| c.votes.count}.inject(:+))*2) + current_user.score_prop}" %>

首先,&lt;%= 已经调用了to_s - 您无需将计算放在字符串中:"#{}"

<%= ((current_user.comments.map{|c| c.votes.count}.inject(:+))*2) + current_user.score_prop %>

其次,sum 存在并且比inject 更容易理解,因此最好尽可能使用它:

<%= ((current_user.comments.map{|c| c.votes.count}.sum)*2) + current_user.score_prop %>

最后,让我们去掉部分。这让我们看到部分你的长计算是打破的位 试试这个,看看现在是否有任何换行:

<% comment_vote_count = current_user.comments.map{|c| c.votes.count}.sum
   # I've added this as my best guess for what will fix your problem
   comment_vote_count ||=0 

   comment_vote_count *= 2
   total_vote_count = comment_vote_count + current_user.score_prop %>
<%= total_vote_count %>

现在,一旦您完成了所有工作 - 您可以再次将代码放回一行 - 当出现问题并且您无法确定哪位出错时,将这些内容分开是很好的。

【讨论】:

  • 我收到此错误:#:0x00000101561d80> 的未定义局部变量或方法 `coment_vote_count'
  • 那是因为有一个错字(现已修正)
  • 是的 - 只有在您登录时才应该这样做 - 否则 current_user 为 nil。
  • 是的,很抱歉,只是补充了一点,就像一个魅力! :))))))
  • 非常感谢! :)))))))
猜你喜欢
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 2014-09-08
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
相关资源
最近更新 更多