2014-02-06 81 views
1

我正在實施一個簡單的投票系統,並通過點擊按鈕添加+1。例如,如果一個問題有5票,它會增加。我已經寫過這個方法了,但是我不知道如何通過點擊link_to來執行它。我需要重新配置我的路線嗎?Rails 4使用link_to或button_to來運行方法?

questions_controller.rb

def self.ping 
    @question = Question.find(params[:id]) 
    @question.increment!(:amplify) 

    render_to do |format| 
     if @question.save 
     format.html { redirect_to @question } 
     end 
    end 
    end 

的routes.rb

resources :questions 
post '/ping' => 'questions#ping', as: 'ping' 

回答

2

你的路線需要支持的id

post '/ping/:id' => 'questions#ping', as: 'ping'

或者更好的是,如果你想讓它的問題內作用域:

resources :questions do 
    post '/ping' => 'questions#ping', as: ping 
end 

不過,我不希望你在你的questions_controller類方法ping認爲。我想你只是想要一個實例方法:

def ping 
    @question = Question.find(params[:id]) 
    @question.increment!(:amplify) 

    if @question.save 
    render_to do |format| 
     format.html { redirect_to @question } 
    end 
    end 
end 

如果這樣不起作用,你會在日誌中看到什麼錯誤?

+0

我應該發佈我的觀點:'<%= link_to question.amplify,問題。ping%>' 'question'已經被定義並且ping方法被調用,但是根本沒有任何事情發生。 如果我在視圖中添加'<%question.increment!(:amplify)%>',它也可以正常工作。 – user3048402

+0

@ user3048402改爲嘗試使用'<%= link_to question.amplify,ping_path(問題)%>'。 – jvperrin

0

繼CDub的答案,你可能會從member route (2.10)受益:


路線

#config/routes.rb 
resources :questions do 
    member do 
     post :ping 
    end 
end 

這應該提供這些路線:

http://yourapp.com/questions/:question_id/ping 

查看

此網址從POST訪問,並且將使用link_to來最好訪問:

<%= link_to "+1", question_ping_path(question.id), method: :post %> 

控制器

你並不需要在控制器中聲明類方法

#應用程序/控制器/ questions_controller.rb DEF平 @question = Question.find(PARAMS [:question_id]) @ question.increment!(:放大)

render_to do |format| 
    format.html { redirect_to @question } 
end 

.increment!保存記錄:)