使用按钮增加数据库

时间:2015-10-20 04:32:02

标签: ruby-on-rails ruby ruby-on-rails-4

我有一张名为posts的表。在其中我有一个名为vote的列,它是一个整数。

在我的posts_controller中,我有:

  def upvote
    @post = Post.find params[:id]
    @post.votes = @post.votes +1
  end

在我看来,我有

  <%= link_to 'like', upvote(post.id)%>

在我的路线中我有

  resources :posts do
    member do
      put :upvote
    end
  end

每次用户点击时,我都希望它上升+1。我一直收到错误:

  

未定义的方法`upvote&#39;对于#&lt;#:0x007fc180f8d650&gt;

突出显示这一行

 <%= link_to 'like', upvote(post.id)%>

感谢您的帮助!!

2 个答案:

答案 0 :(得分:3)

你需要做几件事。

  1. 使用正确的路线。如果您有upvote(post.id),则应为upvote_post_url(post.id)。详细了解路线助手here
  2. 您的控制器操作upvote需要修改传入的帖子。 Rails有一些built in counter incrementer来帮助解决这个问题。如果在同一帖子中添加了多个类似条件,它将为您节省任何竞争条件。

    def upvote
      Post.increment_counter(:votes, params[:id])
    end
    
  3. 我建议您遵循Ruby on Rails教程来帮助您入门。 Rails for Zombies很有趣。

答案 1 :(得分:0)

yez's回答之后,您还需要更改method of your link_to

<%= link_to 'like', posts_upvote_path(post), method: :put %>

您还希望改善路线(默认情况下,所有路线均为member路线):

#config/routes.rb
resources :posts do
   put :upvote
end

你也更适合使用increment!方法(这与yez的increment_counter基本相同,但更简洁):

def upvote
  @post = Post.find params[:id]
  @post.increment! :votes
end