升级到Rails 3.1,改为jQuery,现在我的ajax似乎没有更新字段

时间:2011-12-24 07:00:49

标签: jquery ajax ruby-on-rails-3.1

我有一个网站(GiggleTrigger.com),用户可以投票选出他们认为有趣的妙语(点击“傻笑”按钮)。这是通过ajax调用设置的,但现在升级到Rails 3.1后,我似乎打破了这个。我试图将javascript更新为jQuery,但它仍然无效。

这是旧的javascript代码(放在views / votes / create.js.rjs中):

page.replace_html "vote_total_#{@punchline.id}", "#{@punchline.votes.size}"

以下是尝试更新的代码(置于views / votes / create.js.erb中):

$("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size  %>");

以下是html(置于views / punchlines / _punchline.html.erb中):

<span id="vote_total_<%= punchline.id %>" class="punchline_votes">
    <%= punchline.votes.size %>
</span>
<span id="vote_button">
    <%= button_to 'giggle', punchline_votes_path(:punchline_id => punchline), :remote => true %>
</span>

这是控制器代码(放在controllers / votesController.rb中):

class VotesController < ApplicationController
  def create
    @punchline  = Punchline.find(params[:punchline_id])
    @vote       = @punchline.votes.build params[:vote]
    @vote.user  = current_user

    respond_to do |format|
      if @vote.save
        format.js        
        format.html { redirect_to @punchline }
      else
        format.html { redirect_to root }
      end
    end
  end
end

*我收到此错误:

ActionView::Template::Error (undefined method `model_name' for Fixnum:Class):
  1: $("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size  %>");
      app/views/votes/create.js.erb:1:in `_app_views_votes_create_js_erb__1782616409977082835_2168430380'
      app/controllers/votes_controller.rb:7:in `create

因为这似乎是传递整数的问题,所以我添加.to_s方法,如下所示:

$("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size.to_s  %>");

但是我收到了这个错误:

ActionView::Template::Error (Missing partial votes/1, application/1 with {:handlers=>[:erb, :builder, :coffee], :formats=>[:js, :html], :locale=>[:en, :en]}. Searched in:
  * "/Users/Daniel/Sites/giggle/app/views"
  * "/Users/Daniel/.rvm/gems/ruby-1.9.2-p290@giggle/gems/devise-1.5.3/app/views"
):
    1: $("#vote_total_#{@punchline.id}").html("<%= escape_javascript render @punchline.votes.size.to_s  %>");
  app/views/votes/create.js.erb:1:in `_app_views_votes_create_js_erb__1782616409977082835_2187483480'
  app/controllers/votes_controller.rb:7:in `create'

我尝试添加这样的部分:

$("#vote_total_#{@punchline.id}").html("<%= escape_javascript render :partial => 'punchline', :object => @punchline.votes.size  %>");

但后来我收到了这个错误:

ActionView::Template::Error (Missing partial votes/punchline, application/punchline with {:handlers=>[:erb, :builder, :coffee], :formats=>[:js, :html], :locale=>[:en, :en]}. Searched in:
  * "/Users/Daniel/Sites/giggle/app/views"
  * "/Users/Daniel/.rvm/gems/ruby-1.9.2-p290@giggle/gems/devise-1.5.3/app/views"
):
    1: $("#vote_total_#{@punchline.id}").html("<%= escape_javascript render :partial => 'punchline', :object => @punchline.votes.size.to_s  %>");
  app/views/votes/create.js.erb:1:in `_app_views_votes_create_js_erb__1782616409977082835_2185760740'
  app/controllers/votes_controller.rb:7:in `create'

当我点击傻笑按钮时,投票会添加到模型对象中,但除非我刷新页面,否则它不会更新视图。显然,我希望通过ajax在没有刷新的情况下实现这一点。谢谢!

2 个答案:

答案 0 :(得分:1)

你可以添加

if(!document.getElementById("vote_total_#{@punchline.id}")) {
  alert("Id doesn't exist: " + "vote_total_#{@punchline.id}");
}

到你的javascript,如果id不好,它会提醒你。具有该id的元素不存在的错误含义。我很好奇为客户端实际生成了什么,这是ajax,大部分都是客户端的东西。

您还应该检查控制台(firebug或webkit检查器)并打开XMLHttpRequest日志记录,并在单击Giggle时查看是否有任何真正的ajax:D

- 对于webkit检查器,窗口的右下角有一个齿轮图标。单击此按钮,您将看到记录XHR的选项。

- 如果有人可以评论Firebug,那就太棒了。

答案 1 :(得分:0)

好的,我明白了。旧的原型代码:

page.replace_html "vote_total_#{@punchline.id}", "#{@punchline.votes.size}"

使用#{}将ruby数据发布到元素中。但jQuery使用#来表示id。所以,我将我的jquery选择器从#{}更改为&lt;%=%&gt;它解决了这个问题:

$("#vote_total_<%= @punchline.id %>").html("<%=@punchline.votes.size%>");