通过Ajax Rails调用helper方法

时间:2012-10-02 23:40:34

标签: ruby-on-rails ruby ajax ruby-on-rails-3 render

我需要更新我的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渲染该方法“投票”?

非常感谢。

1 个答案:

答案 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实现更有可能发生变化。它还会给你一个改变,写一些简单的咖啡因,这总是一个奖金!