2

我需要在不重新加载页面(AJAX)的情况下更新我的 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 呈现该方法“投票”?

非常感谢。

4

1 回答 1

-2

设置一个简单的javascript:

投票-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 实现更有可能发生变化。它还可以让您更改编写一些简单的咖啡脚本,这始终是一个奖励!

于 2012-10-03T03:58:21.573 回答