我需要更新我的rails模型的一些数据,而无需重新加载页面(AJAX)。
我有一个像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渲染该方法“投票”?
非常感谢。
答案 0 :(得分:-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实现更有可能发生变化。它还会给你一个改变,写一些简单的咖啡因,这总是一个奖金!