Problem z wyświetleniem informacji o błędzie w miejscu kursora myszy

Mam mały problem z jQuery, w widoku mam generowane dwa linki do głosowania (ajax). W przypadku gdy użytkownik nie ma praw do głosowania rzucany jest wyjątek CanCan::AccessDenied, który obsługiwany jest na razie w ten sposób, że renreduję partial, z wyskakującym alertem: alert(‘test’). Wszystko działa tak jak powinno, czyli użytkownik niezalogowany klika link głosowania i wyskakuje mu okienko ‘test’.

No i tutaj zaczyna się mój problem, bo chciałbym ten alert (w przyszłości jakiś div z prośbą o zalogowani) wyświetlić w miejscu gdzie został kliknięty link.
Nie wiem za bardzo jak się do tych współrzędnych kursora myszy dobrać. Zrobiłem coś takiego:

[code=javascript]var pageX,pageY;
$(document).mousemove(function(e){
pageX=e.pageX;
pageY=e.pageY;
})

alert(pageX+","+pageY);[/code]
Problem jest taki, że za pierwszym razem jak klikam jako gość ten link dostaję alert ‘Undefined, Undefined’. Przy kolejnych kliknięciach dostaję już dobre współrzędne.

Tutaj po kolei:

  1. Widok w którym generuję linki do głosowania (+ i - ):

[code=ruby]<% if current_user.nil? || can?(:create, EntryVote.new(entry_id: entry.id)) %>

<%=entry.points_count%>
<%=link_to "+",entry_votes_path(id: entry.id, vote: "up"),method: :post,remote: true, class: "fleft" %> <%=link_to "-",entry_votes_path(id: entry.id, vote: "down"),method: :post,remote: true, class: "fright" %>
<% else %>
<%=entry.points_count%>
<%end%>[/code] 2. Kontroler w którym obsługuję dodanie głosu: [code=ruby] def create @entry = Entry.find(params[:id]) @ev = EntryVote.new( entry_id: params[:id]) authorize! :create, @ev params[:vote] == "down" ? @ev.value = -50 : @ev.value = 50 @ev.user_id = current_user.id @ev.save @entry.reload end[/code] 3. Application_controller w którym obsługuję wyjątek jaki rzuca authorize! [code=ruby] rescue_from CanCan::AccessDenied do |exception| if (exception.action == :create && [EntryVote,CommentVote].include?(exception.subject.class)) || (exception.action == :new && exception.subject.class == Comment) render partial: 'shared/login_box' else redirect_to :back, :alert => exception.action end end[/code] 4. I ten widok shared/login_box [code=javascript]var pageX,pageY; $(document).mousemove(function(e){ pageX=e.pageX; pageY=e.pageY; })

alert(pageX+","+pageY);[/code]

Możesz albo zamiast remote: true, samemu przechwycić event kliknięcia i wtedy sobie zapisać współrzędne + wysłać request. Albo opcja numer dwa to ten javascript z partiala musiałbyś mieć w głównym application.js na stronie, aby on to na bierząco sobie zapisywał a nie w momencie wyrenderowania partiala.

Ok, wybrałem bramkę numer 2 na razie, w application.js dałem zmienne globalne (wygląda na to, że działa), bo ta pierwsza opcja to jeszcze jestem za cienki bolek i nie bardzo wiem jak dobrze wygenerować taki ajaxowy request.

$(document).ready(function() { $('.entry-vote a').click(function(e) { pageX = e.pageX; pageY = e.pageY; }) });