澄清如何在Rails 3中使用“thumbs_up”投票宝石

时间:2011-02-05 15:36:14

标签: ruby-on-rails-3 vote-up-buttons

我正在尝试在Rails 3应用程序上实现thumbs_up投票宝石,但有关实际实施的说明不清楚。在需要gem [ gem'thumb_up']之后以及创建并运行相应的迁移后[ rails generate thumbs_up&& rake db:migrate ] README解释了以下内容:

  

要对模型投票,您可以执行以下操作:
  *速记语法
voter.vote_for(可投票)#添加+1   投票
voter.vote_against(可投票)#   添加-1投票选民投票(投票,   投票)#添加+1或-1投票:   vote => true(+1),vote =>假(-1)

  voter.vote_exclusively_for(可投票)#   删除之前的任何投票   特别的选民和投票   voter.vote_exclusively_against(可投票)#   删除之前的任何投票   特别的选民和反对票。*

我一直认为在README示例中使用'voter'和'voteable'是应用程序中对象的替身,但这种用法对我来说仍然模糊不清。

我的视图,控制器和routes.rb文件应该是什么样子的文字示例将是一个非常有用的帮助。我花了好几天试图解决这个问题!

在我的应用中,我有用户在帖子上投票 - 其中有两种类型 - 事件链接。使用<%= render:partial =>调用帖子@posts%> ,每个帖子都使用“ _event.html.erb ”或“ _link.html.erb ”视图 - 具体取决于是否是一个事件或链接。

3 个答案:

答案 0 :(得分:24)

希望我能帮助你一点。

生成器应该为您创建一个投票模型。这是持有所有投票的模型,但您通过上述方法间接进行交互。

所以,对你来说:

class User < ActiveRecord::Base
  acts_as_voter
end

class Post < ActiveRecord::Base
  acts_as_voteable
end

这将使您在每个模型中使用thumbs_up方法进行设置。

然后,例如,如果您在PostsController中有一个控制器动作,该动作链接到您网站上的“向上箭头”,则可以为该帖子为该用户创建投票。

这样的观点:

<%= link_to('vote for this post!', vote_up_post_path(@post), :method => :post) %>

和这样的routes.rb:

resources :posts do
  member do
    post :vote_up
  end
end

最后,在控制器中:

class PostsController < ApplicationController
  def vote_up
    begin
      current_user.vote_for(@post = Post.find(params[:id]))
      render :nothing => true, :status => 200
    rescue ActiveRecord::RecordInvalid
      render :nothing => true, :status => 404
    end
  end
end

答案 1 :(得分:1)

路由错误

  

没有路线匹配{:action =&gt;“vote_up”,:controller =&gt;“microposts”,   :ID =&GT;零}

这是我正在使用的链接,并假设这是未正确指定路由的地方。我跑了rake路线,有一条名为vote_up_micropost的路线。还有什么我应该研究的。谢谢

这是我添加的链接

<%= link_to('vote for this post!',
    vote_up_micropost_path(@microposts),
    :method => :post) %>

答案 2 :(得分:0)

这只是布拉迪回答的延续。

Brady在他的观点中有以下代码

<%= link_to('vote for this post!', vote_up_post_path(@post), :method => :post) %>

他的意思是......因为默认情况下link_to使用:method => 'get'&amp;他想用post&amp;更新记录。没有得到他正在使用:method => 'post'

你可以使用&lt;%= button_to('投票支持这篇文章!',vote_up_post_path(@ post)%&gt;,因为按钮默认使用:method => :post

所以路线应该是

resources :posts do
  member do
    post :vote_up
  end
end

在会员内post :vote_upmethod => :post&amp;不是帖子控制器

但是如果您决定使用link_to而不使用:method => :post这样的内容

<%= link_to('vote for this post!', vote_up_post_path(@post)) %>

那么您的路由应该是

resources :posts do
   member do
      get :vote_up
   end
end

希望这有帮助!