11

我正在尝试在 Rails 3 应用程序上实现thumbs_up投票 gem,但实际实现中的说明尚不清楚。在需要 gem [ gem 'thumbs_up' ] 并创建并运行适当的迁移 [ rails generate thumbs_up && rake db:migrate ] 之后,自述文件解释如下:

要为模型投票,您可以执行以下操作:
*简写语法
voter.vote_for(voteable) # 添加 +1 票
voter.vote_against(voteable) # 添加 -1 票
voter.vote(voteable, vote) # 添加+1 或 -1 投票:vote => true (+1), vote => false (-1)

voter.vote_exclusively_for(voteable) # 删除该特定选民之前的任何投票,并投票。
voter.vote_exclusively_against(voteable) # 删除该特定选民之前的任何投票,并投反对票。*

我一直假设在 README 示例中使用“voter”和“voteable”是应用程序中对象的替身,但对我来说,用法仍然很模糊。

我的视图、控制器和 routes.rb 文件应该是什么样子的文字示例将是一个巨大的帮助。我花了几天时间试图弄清楚这一点!

在我的应用程序中,我有用户对帖子进行投票 - 其中有两种类型 -事件链接。使用<%= render :partial => @posts %>调用帖子,每个单独的帖子都使用“ _event.html.erb ”或“ _link.html.erb ”作为其视图 - 取决于它是事件还是链接。

4

3 回答 3

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
于 2011-02-10T22:05:24.807 回答
1

路由错误

没有路线匹配 {:action=>"vote_up", :controller=>"microposts", :id=>nil}

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

这是我添加的链接

<%= link_to('vote for this post!',
    vote_up_micropost_path(@microposts),
    :method => :post) %>
于 2013-02-15T14:58:44.580 回答
0

This is just a continuation of Brady's answer.

Brady had the following code in his view

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

what he means is.. since link_to by default uses :method => 'get' & he wanted to update the record using post & not get so he is using :method => 'post'

U can use <%= button_to('vote for this post!', vote_up_post_path(@post) %>, because button by default uses :method => :post

so the routes should be

resources :posts do
  member do
    post :vote_up
  end
end

here in post :vote_up inside the member, its the method => :post & not the post controller

but if you are determined to use link_to without :method => :post something like this

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

then your routing should be

resources :posts do
   member do
      get :vote_up
   end
end

Hope this helps!

于 2012-03-14T08:17:28.600 回答