0

我正在将 Thumb_Up gem 用于 Rails 上的 ruby​​。 https://github.com/brady8/thumbs_up

我希望用户能够对帖子进行投票。但是,我无法弄清楚如何允许用户单击每个帖子旁边的按钮并向数据库添加投票。

我可以通过执行以下操作在 Rails 控制台中实现这一点:

u=User.first

m=Micropost.first

u.vote_for(m)

但是,如何在视图中单击按钮时发生这种情况。我假设我必须使用 ajax,但我怎么知道我需要发布到的 url 以使这个动作发生?

任何帮助将不胜感激。

更新:

非常感谢你的帮忙!我仍然对下面的代码有问题。

这是我的路线.rb

resources :microposts do
  post :vote, :on => :member
end

看法:

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

控制器:

def vote
    @micropost = Micropost.find(params[:id])
  current_user.vote_for @micropost

  # This assumes you'll only call it via AJAX.
  # If your ajax call doesn't return "ok", then you know something went wrong
  render :text => 'ok', :layout => false
end

但是,我仍然收到此错误:没有路由匹配 {:controller=>"microposts", :id=>#, :action=>"vote"}

有谁知道为什么路线不正确匹配?

4

1 回答 1

1

我假设 Rails 3。Rails 2 的路线看起来会有些不同。

首先,您需要在 config/routes.rb 文件中定义一个路由。你可以通过多种方式做到这一点。如果你已经有微博的路由,你可以简单地添加一个“投票”动作:

    resources :microposts do
      post :vote, :on => :member
    end

(为清楚起见,上面的“post”指的是 HTTP POST 方法,与您的 Micropost 类无关。)如果您使用该路由,则需要在 Microposts 控制器中创建一个“投票”方法来捕获它. 就像是

    def vote
      @post = Micropost.find(params[:id])
      current_user.vote_for @post

      # This assumes you'll only call it via AJAX.
      # If your ajax call doesn't return "ok", then you know something went wrong
      render :text => 'ok', :layout => false
    end

然后在您视图的 AJAX POST 调用中(假设我给出的示例路由),您将获得以下网址:

    vote_micropost_path(@micropost)

它看起来像 /microposts/56/vote

于 2011-04-11T22:28:57.360 回答