2009-08-25 16 views
1

[für mehr sieht später Antwort] EntsendungRails `link_to` Methode mehrfach

Ich denke, das nur eine einfache Schiene Frage ist, und vor allem darüber, wie ich meine Modelle genannt habe und sie in meiner Sicht verweisen. So ein wenig Hintergrund, ich bin mit dem vote_fu Plugin, das ich denke, ist groß, aber ich eine harte Zeit habe die Abstimmung immer von einem Link zu arbeiten wie folgt:

<%= link_to "vote for", current_user.vote_for(answer) %> 

Wo current_user ist ein Helfer und gibt den aktuellen Benutzer zurück, der angemeldet ist und diese Anfrage macht. Das Problem liegt wahrscheinlich in der Art, wie ich answer, die zu meinem question Modell gehört, jede Hilfe wird wirklich geschätzt, auch wenn Sie mir helfen, den richtigen Weg!

oh! es funktioniert auch in der Konsole ... also wenn ich das tue:

user = User.find(1) 
user.vote_for(Question.last) 

Es funktioniert wie erwartet.

+1

Haben Sie bestätigt, dass current_user tatsächlich ein Benutzerobjekt zurückgibt? –

+2

Da ich vote_fu nicht kenne, werde ich nur kommentieren, aber was gibt 'current_user.vote_for (answer)' zurück? Sollten Sie nicht über einen Pfad oder eine Instanz eines Modells verfügen, das über ausreichende Ressourcen verfügt? – theIV

+0

hey @theIV du hast Recht ... Ich brauche einen Pfad, aber da es das Thema einer has_many Assoziation ist, wie sieht dieser Pfad aus? Ich bin damit verwirrt ... user_answer_votes_path (antwort) –

Antwort

1

current_user.vote_for(answer) rufen, dass Methode sofort. Nur weil es in: URL heißt nicht, dass es eine spezielle Behandlung bekommt. Es wird wie jede andere Rubinmethode ausgeführt.

Sie wollen wahrscheinlich so etwas wie dies zu tun.

// view 
<%= link_to "Vote up", :url => vote_up_answer_path(answer), :method => "post" %> 

// controller 
class AnswersController < ApplicationController 
    def vote_up 
    answer = Answer.find(params[:id]) 
    current_user.vote_up(answer) 
    redirect_to :back 
    end 
end 

// routes 
map.resources :answers, :member => {:vote_up => :post, :vote_down => :post} 
0

Blah! Ich den ersten Teil meiner Frage gelöst ... na ja ... vielleicht, es scheint, dass meine Lösung nicht sehr ruhig ist, hier ist das, was ich getan habe:

<%= link_to "Vote Up", :url => current_user.vote_for(answer), :method => :post %> 

So ist die seltsame Sache hier ist, dass es funktioniert, aber jedes Mal, wenn ich die Seite neu lade, fügt es eine Abstimmung allen Benutzern mit einer Antwort hinzu (oder Kommentare, wie die meisten Blogs betroffen wären), es macht auch die URL localhost/questions/65?method=post&url=true, ich bin mir nicht sicher, was mein nächster Aktionsplan hier ist .


Nach einer wenig mehr Untersuchung, das Beispiel der vote_fu Beispiel app dies in der Steuerung hat Aktion erstellen, aber ich weiß nicht einmal einen Controller für meine Stimme Modell habe und die Stimmen sind immer noch gemacht, jede Idee?

def create 
@quote = Quote.find(params[:quote_id]) 

respond_to do |format| 
    if current_user.vote(@quote, params[:vote]) 
    format.rjs { render :action => "create", :vote => @vote } 
    format.html { redirect_to([@quote.user, @quote]) } 
    format.xml { render :xml => @quote, :status => :created, :location => @quote } 
    else 
    format.rjs { render :action => "error" } 
    format.html { render :action => "new" } 
    format.xml { render :xml => @vote.errors, :status => :unprocessable_entity } 
    end 
end 
+2

Wie ich oben sagte, gehört dieser 'vote_for' Aufruf zu Ihrem Controller. 'vote_for' gibt eine Stimme ab. –

+0

Es ist bereits in der Funktionalität des Plugins, muss ich es noch in den Controller setzen? –

+1

Sie haben erwähnt, dass es in der Konsole funktioniert. Sie senden Ihrem Benutzerobjekt eine Nachricht "Abstimmung für die letzte Frage". Stellen Sie sich nun vor, was passiert, wenn Ruby Ihren Link erstellt: Sie senden eine Nachricht an Ihr Benutzerobjekt "Stimme für diese Antwort", während Sie den Link erstellen. Sehen wir uns den Beispielcode an - /examples/votes/_voteable_vote.html.erb - Wenn Sie dieses Plugin verwenden möchten, ist es am einfachsten, den Code nach dieser Ansicht zu modellieren. –

1

Das Beispiel, das ist ziemlich alt ist, hat dies in der Ansicht:

<%= link_to "Vote Up", :url => current_user.vote_for(answer), :method => :post %> 

Aber das macht die URL die Abstimmung Methode in dem Query-String hat ... er ist rjs verwenden und Ich würde es bevorzugen, jquery zu verwenden, bin mir nicht sicher, wie ich meinen nächsten Schritt machen soll, damit das funktioniert, und nicht für alle Antworten auf der Seite abstimmen?

1

Eine Klärung der "vote_for in Ihrem Controller gehört":

Sie haben:

<%= link_to "Vote Up", current_user.vote_for(answer) %> 

Was Sie wirklich wollen, ist:

<%= link_to "Vote Up", :controller => 'my_controller', :action => 'vote', :id => answer %> 

Das current_user.vote_for Verfahren ein Verfahren auf das ist Server. Wenn Sie diese Methode in Ihrer Ansicht (.rhtml-Datei) aufrufen, erfolgt die Abstimmung beim Rendern der Seite, nicht wenn der Benutzer auf den Link klickt. Erstellen Sie stattdessen eine "vote" -Methode auf einem geeigneten Controller (ich nannte es my_controller hier, machen Sie es, was Sie wollen). Die Methode vote sieht dann wie das Beispiel vote_fu aus. Der link_to erstellt einen Hyperlink zur Abstimmungsaktion. Wenn Sie dies über Ajax versuchen, ersetzen Sie link_to durch link_to_remote.

<%= link_to_remote "Vote Up", :url => { :controller => 'my_controller', :action => 'vote', :id => answer } %> 

Wenn Ihre Ansichten/my_controller/Abstimmung Vorlagendatei ‚.rjs' ist, wird die Javascript in dieser Datei ausgeführt werden, wenn das Ergebnis des Verfahrens auf die Seite zurückgibt. Wenn es .rhtml 'ist, sollten Sie die Helfer suchen in für link_to_remote für leicht ein div auf der Seite der Aktualisierung mit der enthält das Ergebnis des Verfahrens (http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper.html#M001645 - Sie :update Option wollen)