【问题标题】:Implementing vote_fu in rails app (or alternatives)在 Rails 应用程序(或替代方案)中实现 vote_fu
【发布时间】:2010-02-22 00:00:22
【问题描述】:

一段时间以来,我一直在尝试在 Rails 中实现一个强大的投票系统,但一直在苦苦挣扎。最初我建立了自己的投票系统,但它过于简单。

简而言之,它只是使用计数器缓存增加了Answer 模型中的votes_count 列。这对我来说很好用了一段时间,直到我发现了 vote_fu 并意识到我的投票系统可以变得更加强大。我立即安装了它,整个周末都在拆开我的应用程序,试图让它工作。

我在 Stack Overflow 上发现了一些与此插件相关的其他问题,但实际上没有一个问题提出最终解决方案。这是我的代码:

answers_controller.rb:

def vote_up
    answer = Answer.find(params[:id])
    current_user.vote_up(answer), :voter_id => current_user.id
    redirect_to :back
end

votes_controller.rb:

def create
  @quote = Answer.find(params[:answer_id])

  respond_to do |format|
    if current_user.vote(@answer, params[:vote])
      format.rjs  { render :action => "create", :vote => @vote }
      format.html { redirect_to root_url }
    else
      format.rjs  { render :action => "error" }
      format.html { render :action => "new" }
      format.xml  { render :xml => @vote.errors, :status => :unprocessable_entity }
    end
  end
end

answer.html.erb:(这里有两种不同的方法,这些都不起作用)

<span id="vote_form"  style="float: right;">
  <%= link_to "Vote up", :url => vote_up_answer_path(answer) %>
  /
  <%= link_to_remote "Down", :
    url => user_answer_votes_path(answer.user, answer,  :vote => :false, :format => :rjs), :method => :post
  %> 
</span>

<span id="<%= answer.id %>_vote_score" class="vote_score">
  <%= answer.votes_for - answer.votes_against %>
</span> 

routes.rb:

map.resources :users, :member => { :suspend => :put, :unsuspend => :put, :purge => :delete } do |user|
  user.resources :votes
  user.resources :answers do |answer|
    answer.resources :votes
  end
end
map.resources :answers, :has_many => :votes, :member => {:vote_up => :post, :vote_down => :post}

我使用的是 Rails 2.3.5。

有人有什么建议吗?我应该回到旧的手工投票系统吗?还有其他我没听说过的投票插件或方法吗?

【问题讨论】:

  • Vote_fu 很棒。特别是什么不起作用?
  • 这对我来说也很棒!这就是为什么我真的想让它工作!似乎我的 link_to 界面无法正常工作......当我点击时它根本没有添加任何投票。此外,在控制台中,当我尝试 u = User.first a = Answer.last u.votes_for(a) 时,我收到如下错误:“unknown attribute: voter”...我不知道如何解决这个问题。

标签: ruby-on-rails ruby-on-rails-plugins voting


【解决方案1】:

我认为第一步是让它通过控制台工作。从您评论中的最后一个错误来看,您的模型似乎设置不正确。在您的 User 模型中,您应该具有以下内容:

#In User.rb
acts_as_voter

#In Answer
acts_as_votable

另外,请确保您已将rake:migrate 应用于您的数据库,然后在控制台中尝试此操作:

u = User.first 
a = Answer.last 
u.votes_for(a)

当我过去使用它时,我会得到一个如下所示的控制器操作:

def vote
  @question = Question.find(params[:id])
  if params[:vote] == 'up'      
    current_user.vote_for(@question)
  elsif params[:vote] == 'down'      
    current_user.vote_against(@question)
  end
  redirect_to @question
end

【讨论】:

    【解决方案2】:

    jt 的回答帮助我让它工作。我的控制器没有开箱即用的vote_for 方法。我认为他们应该将其添加到文档中。

    def vote
        @question = Question.find(params[:id])
        if params[:vote] == 'up'      
          current_user.vote_for(@question)
        elsif params[:vote] == 'down'      
          current_user.vote_against(@question)
        end
        redirect_to @question
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 2012-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多