2015-10-20 44 views
0

我有一個稱爲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。我不斷收到一個錯誤:

undefined method `upvote' for #<#:0x007fc180f8d650>

它強調此行

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

感謝您的幫助!

+0

運行'''rake routes'''命令,很可能你的upvote方法是'''posts_upvote_path'''和'''posts_upvote_url'' –

+0

@Matt:對於投票系統你可以嘗試'act_as_votable' gem根據您的要求,它很容易整合和使用。這是鏈接https://github.com/ryanto/acts_as_votable –

回答

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 
    

我建議也遵循Ruby on Rails的教程,以幫助您開始。 Rails for Zombies是一個有趣的。

+0

良好的通話,謝謝我將進行編輯。 – yez

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 
+0

感謝您的回覆。我已經說過我的模型,控制器和視圖。我一直在收到無法找到'ID'=錯誤的帖子。有任何想法嗎? –