如何使用Rails 3 gem方法更新数据库模型?

时间:2011-04-11 22:02:39

标签: ruby-on-rails rubygems gem vote-up-buttons

我在轨道上使用Thumb_Up gem作为ruby。 https://github.com/brady8/thumbs_up

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

我可以通过执行以下操作在rails控制台中实现此目的:

u=User.first

m=Micropost.first

u.vote_for(m)

但是,如何在视图中单击按钮时才能实现此目的。我假设我必须使用ajax,但我怎么知道我需要发布的url才能使这个动作发生?

非常感谢任何帮助。

更新

非常感谢你的帮助!我仍然遇到下面代码的问题。

这是我的routes.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 =&gt;“microposts”,:id =&gt;#,:action =&gt;“vote”}

有人知道为什么路线不能正确匹配吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

(为清楚起见,上面的“post”指的是HTTP POST方法,与Micropost类无关。)如果使用该路由,则需要在Microposts控制器中创建“vote”方法抓住它。像

这样的东西
    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