我正在设置我的投票系统,并尝试拥有一个帮助模型,以便我可以检查用户是否已投票购买了一张卡。我是铁杆的新手,似乎无法想出这个。
如何让模型检查对user_id
和current_user
的{{1}}的记录进行投票?
我还试图通过设置card_id
变量来限制_cards.html.erb
每次迭代多次调用帮助器。不知道如何做到这一点,尝试设置变量只是为每张卡打印true,即使是那些没有投票的卡。
设置变量不起作用,也不是帮助器,因为它始终为真。
cards_controller.rb :
voted
_cards.html.erb:
def if_voted(card_id)
if Vote.where(:user_id => current_user.id, :card_id => card_id) then
true
else
false
end
end
helper_method :if_voted
在@tadman的帮助下
cards_controller.rb
<td>
<%= @voted = if_voted(card.id) %>
<% if @voted == true %>
<span class="green"><center>
<% elsif @voted == false %>
<span class="red"><center>
<% else %>
<span class="gray"><center>
<% end %>
<%= card.up_votes - card.down_votes %>
</center></span>
</td>
_cards.html.erb
def if_voted(card_id)
if Vote.where(:user_id => current_user.id, :card_id => card_id).any? then
@vote = Vote.find_by(:user_id => current_user.id, :card_id => card_id)
return @vote.voted
else
return nil
end
end
helper_method :if_voted
谢谢
答案 0 :(得分:4)
即使该范围不包含任何记录,where
方法也始终返回范围。 find_by
方法使用相同的选项但返回第一个匹配记录,如果找不到则记录nil
。
any?
方法为true
,否则为false
。
您应该将代码更新为:
def if_voted(card_id)
Vote.where(:user_id => current_user.id, :card_id => card_id).any?
end
值得注意的是关于Ruby风格的一些事情:
then
子句的末尾使用if
,虽然支持,但是无关紧要,通常没有完成。== true
通常是您的逻辑混淆的标志。如果您关注的是文字true
而非逻辑真实,请改用=== true
。在这种情况下,关闭足够的计数,因此if (if_voted(...))
就足够了。true
或false
,但您有三个条件,就好像您希望有一天maybe
弹出一样。if_voted
这样的方法名称有点笨拙,特别是在if
内使用时。像has_voted?
这样的东西通常更符合Ruby和Rails,所以你得到的if (has_voted?(...))
读得更好。User
类中,这样您就可以删除帮助程序并最终使用if (current_user.has_voted?(card_id))
作为表达意图的非常明确的方式。