2010-01-19 5 views
16

Es ist offensichtlich von der documentation (und Google), wie man eine Verbindung mit einem Segment z. podcast/5#comments. Sie übergeben einfach einen Wert für :anchor an link_to.Was ist der richtige Weg, um ein Anker-Tag in Schienen zu definieren?

Mein Anliegen ist über die viel einfachere Aufgabe der Generierung der <a name="comments">Comments</a> Tag, d. H. Das Ziel der ersten Verbindung.

Ich habe folgendes versucht, und obwohl sie schien zu funktionieren, das Markup war nicht das, was ich erwartet hatte:

link_to "Comments", :name => "comments" 
link_to "Comments", :anchor => "comments" 

Ich glaube, ich bin etwas fehlt offensichtlich. Vielen Dank.

+0

Sorry für die nicht verstehen, was Sie * deutlich * schrieb! Mein Fehler! Freut mich, dass du die Antwort bekommen hast, die du brauchst. Ich habe meins entfernt, um niemanden zu verwirren :) –

Antwort

52

Sie bekommen von Rubys syntaktischer Zucker verwechselt (die Schienen verwendet überschwänglich). Lassen Sie mich das kurz erklären, bevor Sie Ihre Frage beantworten.

Wenn eine rubin Funktion einen einzigen Parameter, die ein Hash ist:

def foo(options) 
    #options is a hash with parameters inside 
end 

können Sie ‚vergessen‘ die Klammer/Klammern zu setzen und es so nennen:

foo :param => value, :param2 => value 

Rubin füllen Sie die Lücken aus und verstehen, dass das, was Sie versuchen zu erreichen, ist dies:

Nun zu Ihrer Frage: link_to dauert zwei optionale Hashes - eine heißt options und die andere html_options. Sie können sich vorstellen, es wie folgt definiert (dies eine Annäherung ist, es ist viel komplexer)

def link_to(name, options, html_options) 
... 
end 

Nun, wenn Sie es auf diese Weise aufrufen:

link_to 'Comments', :name => 'Comments' 

Ruby ein wenig verwirrt. Er wird versuchen, für Sie „um die Lücken zu füllen out“, aber falsch:

link_to('Comments', {:name => 'Comments'}, {}) # incorrect 

Es wird denken, dass name => 'Comments' Teil zu Optionen gehört, nicht zu html_options!

Sie müssen Ruby helfen, indem Sie die Lücken selbst ausfüllen. Legen Sie die gesamte Klammer an ihrem Platz und es verhält sich wie erwartet:

link_to('Comments', {}, {:name => 'Comments'}) # correct 

Sie können tatsächlich den letzten Satz von Klammern entfernen, wenn Sie wollen:

link_to("Comments", {}, :name => "comments") # also correct 

Um html_options zu verwenden, müssen Sie das verlassen müssen erste Reihe von Klammern, obwohl.Zum Beispiel müssen Sie dies für eine Verbindung mit Bestätigungsmeldung und Namen tun:

link_to("Comments", {:confirm => 'Sure?'}, :name => "comments") 

Andere Schienen Helfer haben einen ähnlichen Aufbau (d form_for, collection_select), so sollten Sie diese Technik erlernen. Fügen Sie im Zweifelsfall einfach alle Klammern hinzu.

+0

Genau das habe ich gesucht. Vielen Dank! –

+9

+1 für nicht nur die Lösung, sondern für die Erklärung! – Guillaume

14

Wenn Sie durch Schienen gehen wollen, empfehle ich content_tag (docs).

Beispiel:

content_tag(:a, 'Comments', :name => 'comments') 
+1

Danke, ich denke, das ist, was ich gesucht habe. Es kommt mir jetzt vor, dass in haml nur '% a {: name =>" Kommentare "} Kommentare verwendet werden, um diesen Link zu erstellen. Ich nehme an, ich habe nur erwartet, dass es nicht schwer ist, Links in Schienen zu codieren. –

+0

Manchmal ist es netter, einfach ein Tag hineinzuschmeißen, aber wenn du erbingst und nicht aus Rubin ausbrechen willst, ist das auch nett :) – theIV

+0

Ich mag diese Antwort immer noch, aber egarcia ist, was ich gesucht habe zum. –

0
<%= link_to('new button', action: 'login' , class: "text-center") %> 

erstellt ein Anker-Tag für login.html i.g

<a href="login.html" class = "text-center"> new button </a> 

und für

<a href="admin/login.html" class = "text-center"> new button </a> 

Verwendung

<%= link_to('new button', controller: 'admin', 
    action: 'login' , class: "text-center") %>