关联问题:Vote_fu and Ajax requests
我的Ajax请求似乎有问题。 我要做的是在事件点击投票提交投票然后更新页面而不刷新页面。
votes_controller.rb:
def create
@album = Album.find(params[:album_id])
respond_to do |format|
if current_user.vote(@album, params[:vote])
format.js { render :action => "create", :vote => @vote }
format.html { redirect_to([@album.user, @album]) }
#format.xml { render :xml => @album, :status => :created, :location => @album }
else
format.js { render :action => "error" }
format.html { render :action => "new" }
format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }
end
end
end
链接|查看专辑节目:
<%= link_to_remote "Vote Up",
:url => user_album_votes_path(album.user, album,
:vote => :true, :format => :js),
:method => :post %>
的application.js
jQuery.ajaxSetup({
'beforeSend': function(xhr) {xhr.setRequestHeader("Accept", "text/javascript")}
})
jQuery(document).ready(function() {
$("#votes_.album").bind('click');
})
create.js
page.replace_html "#votes_{@album.id}",
:partial => "album_vote",
:locals => {:album => @album}
这是我收到的以下错误消息:
missing ; before statement
[Break on this error] page.replace_html "#votes_#{@album.id}", ...bum_vote", :locals => {:album => @album}
我不确定这里出了什么问题我一直在关注vote_fu doc的许多例子 还有问题。
http://github.com/peteonrails/vote_fu/tree#readme
对create.js进行了一项修订
现在又出现了另一个错误:
没有错误转移到votes_controller
NoMethodError (You have a nil object when you didn't expect it!
<br />
The error occurred while evaluating nil.vote):
app/controllers/votes_controller.rb:53:in `create'
app/controllers/votes_controller.rb:52:in `create'
<br />
Rendered rescues/_trace (128.4ms)
Rendered rescues/_request_and_response (0.4ms)
Rendering rescues/layout (internal_server_error)
这些行在创建动作上,看起来非常好!?
如何让它发挥作用?
方面
丹
答案 0 :(得分:1)
尝试将create.js更改为
page.replace_html "#votes_#{@album.id}", :partial => "album_vote", :locals => {:album => @album}
您可能错过了变量字符串插值的#。
答案 1 :(得分:1)
<强>解决!强>
问题是我没有添加before语句来刷新投票数!
所以我做了,它的工作原理与此一样,我将create.js更改为create.sj.erb,同时我对application.js文件进行了一些小的更改。毕竟我添加了flash[:note] = you have voted!
,然后在一秒和fadeOut之后添加了一个删除闪光通知的功能!
对于任何感兴趣的人都会看到代码:
的application.js
jQuery(document).ready(function() {
$("#vote").bind('click', function(e) {
if (e.target.tagName == "DIV") {
$(this).find(".album_extened").toggle('blind');
}
})
})
create.js.erb
$("#vote").before('<div id="notice"><%= escape_javascript(flash.delete(:notice)) %></div>');
$("#vote_count").html("<%= @album.votes_for - @album.votes_against %>");
$(document).ready(function() {
setTimeout(hideFlashMessages, 1000);
});
function hideFlashMessages() {
$("#vote, #notice").append('').fadeOut(1000);
}
如果有人知道为什么可以这样做,请转发!!
很好地查看[http://railscasts.com/episodes/136-jquery][1]
阅读[link text] [2]
很快修好了谢谢Jonathan link text
[1]:http://railscasts.com/episodes/136-jquery/“Rails Cast ep 136” [2]:http://www.notgeeklycorrect.com/english/2009/05/18/beginners-guide-to-jquery-ruby-on-rails/“初学者公会到jQuery和Rails” 并感谢Sam的帮助!!
答案 2 :(得分:0)
在我看来,create方法中的current_user没有设置其值。
如何设置current_user值?在其他插件中,他们通常将其定义为 带访问器的实例方法或实例变量。
因此,将create方法更改为以下内容可能有所帮助:
def create
@album = Album.find(params[:album_id])
respond_to do |format|
if @current_user.vote(@album, params[:vote])
format.js { render :action => "create", :vote => @vote }
format.html { redirect_to([@album.user, @album]) }
#format.xml { render :xml => @album, :status => :created, :location => @album }
else
format.js { render :action => "error" }
format.html { render :action => "new" }
format.xml { render :xml => @vote.errors, :status => :unprocessable_entity }
end
end
end
您可能错过了current_user.vote
之前的@