2012-10-02 121 views
2

我需要更新我的軌道模型的一些數據,而無需重新加載頁面(AJAX)。呼叫helper方法的Rails

我有一個信譽系統,如http://railscasts.com/episodes/364-active-record-reputation-system?autoplay=true

在我的控制器有這樣的方法:

def vote 
    value = params[:type] == "up" ? 1 : -1 
    @idea = Idea.find(params[:id]) 
    @idea.add_or_update_evaluation(:votes, value, current_user) 
    redirect_to :back, notice: "Thank you for voting!" 

end 

在我看來,有這樣的:

<% if current_user && !current_user.voted_for?(idea) %> 
| <%= link_to "LoV", vote_idea_path(idea, type: "up"), method: "post" %> 
<% end %> 

我想更新以下數據無需重新加載頁面,在我的應用程序佈局文件有這樣的:

strong>(<%= current_user.reputation_value_for(:votes).to_i %>).</strong> 
<strong>LoV's(<%= link_to current_user.evaluations.count, user_path(current_user)%>)</strong> 

我怎麼能渲染方法「投票」與AJAX?

非常感謝。

回答

-2

設置一個簡單的JavaScript:

vote-ajax.js.coffee

$("a.vote").on 
    click: (event) -> 
     link = $(event.target) 
     $.ajax 
      type:  "POST" 
      url:  "/votes" 
      dataType: "json" 
      data: 
       voteType: link.attr("data-type") 
       userId: link.attr("data-userId") 

      success: (response) -> 
       link.addClass("voted-#{link.attr("data-type")}") 

     event.preventDefault() 
     false 

votes_controller.rb

respond_to :json 

def create 
    @vote = Vote.new(direction: params[:voteType], user_id: params[:userId]) 
    @vote.save 
    respond_with @vote 
end 

這不是一個完整的例子,也不是經過測試,你需要做一些調整,但這應該讓你開始正確的道路。

您還可以使用

<%= link_to "Vote Up", votes_path(direction: "up"), method: :post, remote: true %> 

你需要做一個create.js.erb文件在您views/votes文件夾處理響應,它應該基本上只是看起來像上述的方法success回調。個人而言,我更喜歡使用手動方法(使用jQuery的ajax),因爲它提供了更多的控制權,在不久的將來它不太可能發生變化,而Rails的UJS實現更有可能發生變化。它也讓你改變寫一些簡單的咖啡文字,這永遠是一個獎金!

+1

您好,感謝您的回答,但我沒有votes_controller,投票方法是我的想法控制器裏面,所以我怎麼能處理好與一個Ajax請求的方法? –

+0

這個答案並沒有真正地建立任何東西......當問題清楚地指向rails輔助方法時,你指的是你的答案中的一個控制器。 – cereallarceny

+0

@cereallarceny你的答案在哪裏? – bricker