在Rails中使用Ajax进行投票

时间:2010-10-20 02:55:44

标签: javascript ruby-on-rails ajax voting

我正在尝试允许用户使用Ajax向上/下投票。我正在使用vote_fu插件进行投票功能,没有Ajax,一切正常。我现在正试图找出使用不引人注目的javascript实现异步功能的最佳方法。

我现在正在做的是有两个按钮,“向上”和“向下”,这样当你点击其中任何一个按钮时,会向vot_controller和创建或更新操作发出请求,具体取决于用户是否已经之前提交了对该记录的投票。提交的参数将是record_id以及投票的价值。

使用Ajax,我应该如何处理用户输入页面进行投票但没有在之前投票的情况?具体来说,链接将在开始时转到#revate投票,但在第一次提交后,链接应切换到投票#update。

有没有一种标准的方法可以解决这个问题?我正在考虑在“创建”方法中添加一个额外的检查,如果它找到了user_id,voteable_id对的记录,它会像“更新”一样,但这看起来有点笨拙而且不完全RESTful。

谢谢, 埃里克

2 个答案:

答案 0 :(得分:1)

常用的技巧/模式有几种:

1)当你的erb创建页面时,你可以为作为页面一部分的JS脚本提供一个参数。参数将是“voting_url”,它将是votes / new或者投票/ 123,具体取决于是否应该使用创建或更新操作。

2)您可以使用“过程调用”而不是休息调用。程序/动作将是“change_vote” - 带有'up'的参数,它可以是true或false。如果需要,该操作将创建投票记录,否则将对其进行修改。

3)作为主记录创建过程的一部分,您可以始终创建vote_record。这样,投票操作将始终是更新,因为vote_record将始终存在。

<强>加

Re:的评论什么时候退出休息电话通常是“可接受的”?

休息是一种设计理念。它解决了很多问题但并不适合所有情况。我认为你原来的问题可以,但最终由你和任何评论你的架构的人来决定。由于可以将您的应用程序“弯曲”为此功能的休息API,因此有些人可能会告诉您这样做 - 从而获得不违反Restfulness的好处。

Re:关于朋友关系的评论中的例子:

由于“建立朋友关系”是有意义的,因此在其他条件相同的情况下,将api表达为休息“友谊对象/创建”调用会更好。正是为了你的朋友的例子,创造了休息。 - 旧式替代方案是每个api开发人员必须找出一大堆过程名称。

Rest提供了一种更加一致,标准的名称创建方式。

请注意,“change_vote”过程最好定义为投票对象的一部分:vote / change_vote或类似的东西。我认为,对于不符合标准其余动词的休息程序,有一种“Rails方式”。

答案 1 :(得分:0)

另一个想法是你可以改变网址(可能是通过帮助程序),具体取决于记录是否为新记录。

类似的东西:

link_to_remote "Up", :url => voting_path(@vote)

module VotesHelper
  def voting_path(vote)
    if vote.new_record?
      new_voting_path
    else
      edit_voting_path(vote)
    end
  end
end