2012-12-10 15 views
7

ich eine Blogging-Anwendung, die Beiträge hat, die Stimmen durch eine vote Aktion im Pfosten-Controller empfangen kann. Weil ich stimme sowohl in der Index-und Show-Ansichten, ich redirect_to :back nach einer Abstimmung ist, wie folgt.Wie ein Anker zu redirect_to hinzuzufügen: zurück

def vote 
    # voting logic goes here 
    redirect_to :back 
end 

Dies leitet mich auf die richtige Seite um, aber ich möchte auf den spezifischen Beitrag innerhalb der Seite umleiten. Um dies zu tun, fügte ich meinem Post-Teil-Div einen identifizierenden Anker hinzu.

<div id="post_<%= post.id %>"> 
    <%= post.content %> 
</div> 

Wie kann ich dies in meinem redirect_to :back beziehen? Ich habe das unten versucht, was nicht funktioniert.

Alternativ, wenn ich eine If-Klausel für die Show-und Index-Ansichten verwenden würde, wie mache ich das? Ich habe das folgende versucht, das undefined method 'current_page' for VocabsController zurückgibt.

#this doesn't work! 
if current_page?(posts_path) 
    redirect_to posts_path(anchor: "post_#{@post.id}" 
else 
    redirect_to @post 
end 

Antwort

0

landete ich stattdessen mit Javascript auf.

posts_controller.rb

def vote 
    @post = Post.find(params[:id]) 
    #voting logic 
    respond_to do |format| 
    format.html { redirect_to :back } 
    format.js 
    end 
end 

Beiträge/_post.html.erb

<div class="post_partial" id="post_<%= post.id %>"> 
    <%= post.content %> 
    <div id="vote_button_<%= post.id %>"> 
    <%= link_to "up", vote_path, method: "post", remote: true %> 
    </div> 
</div> 

Beiträge/vote.js.erb

$('#post_<%= @post.id %>').html('<%= j render @post %>'); 
1

EDIT: ok mein schlecht, wurde verwirrt. Sie sollten in so aussehen:

What's the right way to define an anchor tag in rails?

EDIT2:

das Problem, das Sie haben, ist, dass Sie einen Helfer in einem Controller und nicht innerhalb einer Ansicht aufrufen.

Ich ermutigen Sie, in die view_context Methode

http://jhonynyc.tumblr.com/post/5361328463/use-view-context-inside-rails-3-controller

+0

Hallo @ Kevin. Danke für die Eingabe. Es scheint, dass meine erste Option (mit ': back') nicht funktioniert, da sie den Anker nicht akzeptiert. Die zweite Option (mit if-Klausel) scheint in Ordnung zu sein, und die Methode view_context funktioniert. Wie würde ich sagen, "wenn Sie für einen Beitrag auf der Indexseite gewählt haben"? Die Verwendung von 'current_Page? (Posts_path)' funktioniert nicht, wahrscheinlich weil sie innerhalb einer anderen Aktion aufgerufen wird (dh nicht die Index-Aktion). Wie kann ich sagen: „Wenn ich für einen Beitrag auf der Indexseite stimmen, auf der Indexseite zu diesem Post umleiten, sonst auf diese Stelle des Erscheinen Seite umleiten“ – umezo

+2

Ich denke, was Sie tun möchten, ist keine Aktion verwenden Umleitung der Benutzer, aber tatsächlich haben die Benutzer für den Beitrag abstimmen, ohne irgendwo umgeleitet zu werden (bleiben auf der gleichen Seite, wo er gewählt hat). So ist mein Rat einen einfachen Ajax-Link zu verwenden: es führt die angegebene Methode ohne die aktuelle Ansicht des Benutzers zu ändern. BEARBEITEN: Hier ist der Code, den Sie benötigen würden '<% = link_to_function" Vote up "," $ .ajax ({Typ: 'GET', URL: '/ your_controller/voteup /'}) "%>' –

+0

Guter Punkt. das ist mehr oder weniger was ich getan habe. Danke für die Eingabe. – umezo

10

Tief in Rails Umlenkmechanismus zu suchen, bedeutet :back einfach umleiten, was auch immer in HTTP_REFERER Umgebungsvariable (oder einen Fehler, wenn nichts in diesen Variablen erhöhen). Also vor redirect_to :back in Ihrem Controller diese Zeile hinzufügen: env["HTTP_REFERER"] += '#some-id', dies sollte es tun.

+0

Danke @Ahmad. Ich habe am Ende Javascript verwendet, um damit umzugehen. Aber ich werde es mir merken, wenn ich es brauche! – umezo

+0

Weiß jemand, wie dies in Rails 2 getan werden kann. – olleicua

+7

Beantwortete meine eigene Frage: 'redirect_to request.referer + '# some-id'' – olleicua

Verwandte Themen