我有一个网站(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在没有刷新的情况下实现这一点。谢谢!
答案 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%>");